热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java匹马行天下之JavaWeb核心技术——JSP(续一)

十二、JSP表单处理我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用GET和POST方法向服务器提交数据。GET方法GET方法

 

 

十二、JSP表单处理

我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。


GET 方法

GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示:

http://www.runoob.com/hello?key1=value1&key2=value2

GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。

用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。


POST 方法

一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。

POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。

JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。


JSP 读取表单数据

  • getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
  • getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型
  • getParameterNames():该方法可以取得所有变量的名称,该方法返回一个 Enumeration。
  • getInputStream():调用此方法来读取来自客户端的二进制数据流。

 

<%@ page cOntentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>



    




    





  

<%@ page import="java.util.Enumeration" %>
<%@ page cOntentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>



    
    



    

读取参数信息

<% Enumeration parameterNames = request.getParameterNames(); request.setCharacterEncoding("utf-8"); while (parameterNames.hasMoreElements()){ String name = parameterNames.nextElement(); out.println("\n"); String url = request.getParameter(name); out.println("\n"); } %>
参数名 对应值
"+name+""+url+"
<% %>

  

 

十三、四大域对象:实际开发如何用?

    PageContext:pageConext      存放的数据仅在当前页面有效。开发时使用较少。当前页面存放数据用表单标签中的 ,且该存值方式用户看不到。

    ServletRequest: request      存放的数据在一次请求(转发:可以传数据)内有效。使用非常多。

    HttpSession: session         存放的数据在一次会话(多次请求)中有效。使用的比较多。例如:存放用户的登录信息、购物车功能。

    ServletContext: application  存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。用于统计在线人数。

 

十四、会话跟踪

  •   会话概述

  1、什么是会话?如同打电话。

     会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

 

  2、会话过程要解决的问题是什么?保持各个客户端自己的数据。

      每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

      例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

      思考:用户购买的商品保存在request或servletContext中行不行?答:不行。

  保存会话数据的两种技术

    COOKIE:是客户端技术,程序把每个用户的数据以COOKIE的形式写给用户各自的浏览器。

       当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。

       这样,web资源处理的就是用户各自的数据了。

    HttpSession:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象

       由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,

       当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

 

  • http协议的无状态性

无状态是指,当浏览器发送请求给服务器时,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器时,服务器并不知道它就是刚才那个浏览器。简单来说,就是服务器不会去记得你,所以就是无状态协议。

  •   JSP COOKIE 处理

COOKIE是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP COOKIE的支持。

通常有三个步骤来识别回头客:

  • 服务器脚本发送一系列COOKIE至浏览器。比如名字,年龄,ID号码等等。
  • 浏览器在本地机中存储这些信息,以备不时之需。
  • 当下一次浏览器发送任何请求至服务器时,它会同时将这些COOKIE信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。

JSP COOKIE 处理需要对中文进行编码与解码,方法如下:

String   str   =   java.net.URLEncoder.encode("中文","UTF-8");            //编码
String   str   =   java.net.URLDecoder.decode("编码后的字符串","UTF-8");   // 解码

  

  • Servlet COOKIE 方法

 

  • 使用JSP设置COOKIE

使用JSP设置COOKIE包含三个步骤:

(1)创建一个COOKIE对象: 调用COOKIE的构造函数,使用一个COOKIE名称和值做参数,它们都是字符串。

COOKIE COOKIE = new COOKIE("key","value");

  

请务必牢记,名称和值中都不能包含空格或者如下的字符:

[ ] ( ) = , " / ? @ : ;

  

(2) 设置有效期:调用setMaxAge()函数表明COOKIE在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。

COOKIE.setMaxAge(60*60*24);

  

(3) COOKIE发送至HTTP响应头中:调用response.addCOOKIE()函数来向HTTP响应头中添加COOKIE。

response.addCOOKIE(COOKIE);

  

  • 实例说明

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>



    
    




    站点名: 
    
网址:

  

<%@ page import="java.net.URLEncoder" %>
<%@ page cOntentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%
    // 编码,解决中文乱码
    String str = URLEncoder.encode(request.getParameter("name"),"utf-8");
    // 设置 name 和 url COOKIE
    COOKIE name = new COOKIE("name", str);
    COOKIE url = new COOKIE("url", request.getParameter("url"));

    // 设置COOKIE过期时间为24小时。
    name.setMaxAge(60*60*24);
    url.setMaxAge(60*60*24);

    // 在响应头部添加COOKIE
    response.addCOOKIE( name );
    response.addCOOKIE( url );
%>


    



设置 COOKIE

  • 网站名: <%= request.getParameter("name")%>

  • 网址: <%= request.getParameter("url")%>

 

  • 使用 JSP 读取 COOKIE

想要读取COOKIE,您就需要调用request.getCOOKIEs()方法来获得一个javax.servlet.http.COOKIE对象的数组,然后遍历这个数组,使用getName()方法和getValue()方法来获取每一个COOKIE的名称和值。

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.net.*" %>



    
    


<%
    COOKIE COOKIE = null;
    COOKIE[] COOKIEs = null;
    // 获取COOKIEs的数据,是一个数组
    COOKIEs = request.getCOOKIEs();
    if( COOKIEs != null ){
        out.println("

查找 COOKIE 名与值

"); for (int i = 0; i "); out.print("参数值: " + URLDecoder.decode(COOKIE.getValue(), "utf-8") +"
"); out.print("------------------------------------
"); } }else{ out.println("

没有发现 COOKIE

"); } %>

  

  • 使用JSP删除COOKIE

删除COOKIE非常简单。如果您想要删除一个COOKIE,按照下面给的步骤来做就行了:

  • 获取一个已经存在的COOKIE然后存储在COOKIE对象中。
  • 将COOKIE的有效期设置为0。
  • 将这个COOKIE重新添加进响应头中。
  • 实例演示

下面的程序删除一个名为"name"的COOKIE,当您第二次运行COOKIEDemo2.jsp时,name 将会为 null。

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.net.*" %>



    
    


<%
    COOKIE COOKIE = null;
    COOKIE[] COOKIEs = null;
    // 获取当前域名下的COOKIEs,是一个数组
    COOKIEs = request.getCOOKIEs();
    if( COOKIEs != null ){
        out.println("

查找 COOKIE 名与值

"); for (int i = 0; i "); } out.print("参数名 : " + COOKIE.getName()); out.print("
"); out.print("参数值: " + URLDecoder.decode(COOKIE.getValue(), "utf-8") +"
"); out.print("------------------------------------
"); } }else{ out.println("

没有发现 COOKIE

"); } %>

  

 

 

  • 图解分析

 

  • Session

  • HttpSession概述

HttpSession是有JavaWeb提供的,用来会话跟踪的类,session是服务器对象,保存在服务器端;

HttpSession是Servlet三大域对象之一(request、session、application),所以它也有setAttribute()、getAttribute()、removeAttribute()方法;

HttpSession底层依赖COOKIE,或是URL重写。

  • HttpSession的作用
  • 会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束;

会话:一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。

  • 服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称为session缓存。

Servlet中得到session对象:HttpSession session = request.getSession();

JSP中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用。

  • session域相关方法

void setAttribute(String name,Object val);

Object getAttribute(String name);

void removeAttribute(String name);

   

  • session保存用户登录信息

  • 案例相关页面和Servlet:

login.jsp 登录页面

LoginSuccess.jsp 只有登录成功才能访问的页面

LoginServlet:校验用户是否登录成功

  • 各页面和Servlet内容:

login.jsp 提供登录表单,提交表单请求LoginServlet

LoginServlet 获取请求参数,校验用户是否登录成功

失败:保存错误信息到request域,转发到login.jsp,在login.jsp中显示request域中的错误信息;

成功:保存用户信息到session域中,重定向到LoginSuccess.jsp页面,显示session域中的用户信息。

LoginSuccess.jsp 从session域获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息;

只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在,那么用户访问LoginSuccess.jsp就会通过

login.jsp

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>



    


<%
    //获取COOKIE的值
    String name = "";
    String pwd = "";
    COOKIE[] cs = request.getCOOKIEs();
    if(cs!=null){
        for(COOKIE c : cs){
            if("username".equals(c.getName())){
                name = c.getValue();
            }
            if("pwd".equals(c.getName())){
                pwd = c.getValue();
            }
        }
    }
%>
<%
    //获取request信息
    String message="";
    String mess = (String)request.getAttribute("message");
    if(mess!=null){
        message = mess;
    }
%>

用户登录

<%=message %>

账号:

密码:

  LoginServlet.java

 

package com.demo.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置请求的字符编码
        request.setCharacterEncoding("utf-8");
        //接收客户端请求
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        //判断是否登录成功
        if("admin".equals(username) && "1234".equals(pwd)){
            //登录成功,把信息保存到COOKIE中
            COOKIE c1 = new COOKIE("username",username);
            COOKIE c2 = new COOKIE("pwd",pwd);
            c1.setMaxAge(60*60*24);
            c2.setMaxAge(60*60*24);
            response.addCOOKIE(c1);
            response.addCOOKIE(c2);
            //登录成功,保存用户名到session中,并重定向到LoginSuccess.jsp
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            response.sendRedirect("/LoginSuccess.jsp");
        }else{
            //转发给客户端“登录失败”
            request.setAttribute("message", "用户信息错误,请重新登录");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }

    }
}

  

LoginSuccess.jsp

 

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>



    



<%
    //获取session信息
    String name = (String)session.getAttribute("username");
    if(name==null){
        //session不存在,转发到登录页面,并提示信息
        request.setAttribute("message", "您还没有登录,不能访问页面");
        request.getRequestDispatcher("/login.jsp").forward(request, response);
        //重定向到login.jsp,不会显示request提示的信息
        //response.sendRedirect("/login/login.jsp");
        return;
    }
%>

登录成功

你好<%=name %>,欢迎登录!

 

  

  • 隐藏表单域

一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:


  

这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。

这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。


  • 重写URL

您可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。

举例来说,http://w3cschool.cc/file.htm;sessiOnid=12345, session标识符为sessiOnid=12345,服务器可以用这个数据来识别客户端。

相比而言,重写URL是更好的方式来,就算浏览器不支持COOKIEs也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。

  • session依赖COOKIE,目的是让客户端发出请求时归还sessionID,这样才能找到对应的session;
  • 如果客户端禁用了COOKIE,那么就无法得到sessionID,那么session也就无用了;
  • 也可以使用URL重写来替代COOKIE
  • 让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionID;
  • 这样服务器可以通过获取请求参数得到sessionID,从而找到session对象;
  • response.encodeURL(String url)该方法会对url进行智能的重写,当请求中没有归还session这个COOKIE,那么该方法会重写URL,否则不重写,当然url必须是指向本站的url。

  • session对象

除了以上几种方法外,JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。

默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:

<%@ page session="false" %>

  

JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。

下表列出了session对象的一些重要方法:

 

 

 

 

  • Session与COOKIE的对比

 

 

  • HttpSession原理

服务器不会马上给你创建session,在第一次获取session时,即reques.getSession()方法执行时,才会创建session。

获取COOKIE中的JSESSIONID:

  •   如果sessionID不存在,创建session,把session保存起来,把新创建的sessionID保存到COOKIE中;
  •   如果sessionID存在,创建sessionID查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionID保存到COOKIE中;
  •   如果sessionID存在,通过sessionID查找到了session对象,那么就不会再创建session对象了;
  •   如果创建新的session,浏览器会得到一个包含了sessionID的COOKIE,这个COOKIE的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么COOKIE就会一直存在;
  •   下次请求时,再执行request.getSession()方法时,因为可以通过COOKIE中的sessionID找到session对象,所以与上一次请求使用的是同一个session对象。
  •   request.getSession(false):如果COOKIE不存在,session也不存在,那么返回NULL,而不会创建session对象;
  •   request.getSession(true)/request.getSession():两个方法一样,当session对象不存在时,创建session对象
  •   String getId() 获取sessionID;
  •   int getMaxInactiveInterval() 获取session最大的不活动时间(秒),默认为30分钟,当session在30分钟内没有使用,那么Tomcat就会在session池中移除;
  •   void invalidate() 让session失效,调用这个方法会让session失效,当session失效后,客户端再次请求,服务器会给客户端一个新的session;
  •   boolean isNew() 查看session是否为新的,判断是新创建的,还是从COOKIE获取的;

 

(未完待续)

此篇是我在学习过程中参考菜鸟教程以及笔记和别人博客(黑泽君)完成

Java匹马行天下依旧在更新中,欢迎大家关注,感觉可以的可以点击一下推荐,若如有误,感谢指正,谢谢!


推荐阅读
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
author-avatar
手机用户2502934505
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有