红宝儿

导航

JSP数据交互

第二章:JSP数据交互
 
 
 
Validate:验证
Context:上下文
Request:请求  :当前请求(别的请求无效)
Response:响应
Redirect:重定向
Session:会话:当前会话 (可以包含多个请求)在该会话有效期内可以访问
Application:当前服务器(可以包含多个会话):
当服务器启动后就会创建一个application对象,被所有用户共享
page、request、session、application四个作用域对象都有
setAttribute()和getAttribute()方法
而且作用域范围越来越大
 
 
 
1:request对象
 
是从客户端向服务器端发出请求,包括用户提交的信息以及客户端的一些信息。request对象是javax.servlet.http.HttpServletRequest类的实现实例。
 
request对象封装了浏览器的请求信息,通过request对象的各种方法可以获取客户端以及用户提交的各项请求信息。
 
使用request对象获取客户端提交的请求参数的常用方法如下:
 
1.String getParameter(String name),获取上一页面所提交的参数值的参数值,并以字符串形式返回指定参数的值,如果参数不存在则返回空值。用于表单、链接或网址栏传递参数时,使用此方法。
 
例如,获取客户端name的参数值:
 
String name = request.getParameter("name");
 
2.String[ ] getParameterValues(String name),获取以相同名称命名的表单组件提交的数据,主要用于获取复选框的值,返回值类型是字符串数组String[ ]
 
例如,获取客户端hobby复选框的所有取值:
 
String[ ] hobbys = request.getParameterValues("hobby");
       if(hobbys != null)
       {
       out.println("您的爱好有:");
       for(int i=0;i<hobbys.length;i++)
          out.println(hobbys[i]);
       }
 
3.void setCharacterEncoding(String encoding),设置字符编码方式,用来解决传递非英文字符所出现的乱码问题。
 
对于以post提交的表单数据
 
在第一行写:
request.setCharacterEncoding("UTF-8");
 
对于以get提交的表单数据
 
提交的数据作为查询字符串被附加到URL 的末端发送到服务器,此时字服务器端调用
 
setCharacterEncoding()方法就没有作用了,我们需要得到请求参数值之后,进行编码转换
 
String name=request.getParameter("name");
 
name=new String(name.getBytes("ISO-8859-1"),"UTF-8"); 
也可以通过TomCat目录下的conf下的server.xml文件,在<Connector>元素中添加URIEncoding 属性,将它的值设置为“utf-8”
 
<Connector
 
    port="8080"
 
    protocol="HTTP/1.1"
 
     reidrectPort="8433"
 
    URIEncoding ="UTF-8"
 
/>
 
4.RequestDispatcher getRequestDispatcher(String path)----获取请求分配器
 
返回一个javax.servlet.RequestDispatcher对象该方法的forward()方法用于 转发请求
 
例如,request.setCharacterEncoding("UTF-8");
 
实例:使用request对象实现用户注册功能
 
zhuce.html源代码如下:
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>个人信息注册</title>
 
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
 
  </head>
 
  <body>
    <h1 align="center">个人信息注册</h1>
    <form action="zhuce.jsp" method="post">
        姓名:<input type="text" name="name"><br>
        密码:<input type="password" name="pwd"><br>
        请选择你的职业:
        <input type="radio" name="career" value="农民">农民
     <input type="radio" name="career" value="工人">工人
     <input type="radio" name="career" value="学生" checked>学生
     <input type="radio" name="career" value="教师">教师
     <br>
     你喜欢的城市:
     <select name="city">
       <option value="辽宁省">辽宁省</option>
       <option value="湖北省">湖北省</option>
       <option value="河南省">河南省</option>
       <option value="山东省">山东省</option>
       <option value="江苏省">江苏省</option>
       <option value="湖南省" selected>湖南省</option>
     </select>
     <br>
     请选择你的爱好:
     <input type="checkbox" name="hobby" value="旅游">旅游
     <input type="checkbox" name="hobby" value="看书" checked>看书
     <input type="checkbox" name="hobby" value="游戏">游戏
     <input type="checkbox" name="hobby" value="琴棋书画">琴棋书画
     <br>
     自我介绍:
     <textarea name="intro">自我介绍</textarea>
     <br>
     <input type="submit" name="submit" value="提交">
    </form>
  </body>
</html>
zhuce.jsp源代码如下:
 
<%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
   
    <title>个人信息注册</title>
   
 
 
  </head>
 
  <body>
    <%request.setCharacterEncoding("UTF-8"); %>
     您的姓名是:<%=request.getParameter("name") %><br>
     您的密码是:<%=request.getParameter("pwd") %><br>
     您的职业是:<%=request.getParameter("career") %><br>
     您喜欢的城市是:<%=request.getParameter("city") %><br>
     您的爱好有:<%String[] hobbys = request.getParameterValues("hobby");
       if(hobbys != null)
       {
       out.println("您的爱好有:");
       for(int i=0;i<hobbys.length;i++)
          out.print(hobbys[i]);
       }
      %>
      <br>
     自我介绍:<%=request.getParameter("intro") %><br>
  </body>
</html>
 
2:response对象
常用方法:
void addCookie(Cookie cookie):在客户端添加cookie
void sentRedirect(String location);重新定位到新的URL
 
 
getRequestDispatcher()与sendRedirect()的区别
 
1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 
response.sendRedirect()是重新定向,前后页面不是一个request。
 
2.RequestDispatcher.forward()是在服务器端运行; 
HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成. 
 
3.ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径; 而
 
ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为
 
ServletRequest具有相对路径的概念;而ServletContext对象无此概念。
 
RequestDispatcher对象从客户端获取请求request,并把它们传递给服务器上的servlet,html或
 
jsp。它有两个方法:
 
 
2.void include(ServletRequest request,ServletResponse response) 
用来记录保留request和response,以后不能再修改response里表示状态的信息。
 
 
 
二者区别: 
response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参 
数,如: 
url?id=1. 
request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求 
能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而 
sendRedirect()会新建request对象,所以上一个request中的数据会丢失。 
更具体来说就是这样的: 
redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后 
服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的. 
forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的响应. 这时页面 
收到的request不是从浏览器直接发来了,可能己经用request.setAttribute在request里放了数据.在转到的页 
面可直接用request.getAttribute获得数据。 
 
 
 
 
重定向的重要应用:
 
使用重定向技术实现超链接的数据传递
<a href="color.jsp?color=黄色">黄色</a>  
 
使用超链接进行数据传递时,采用的是get方式提交请求,如果在传递数据中存在中文,就会造成乱码,因为request.setCharacterEncoding("utf-8")只适用于post方法提交 所以可以通过 设置tomcat字符集实现
当传递多个数据时,可以用&连接
<a href="color.jsp?color=黄色&id=1">黄色</a>  
 
Session
//设置10分钟后失效
session.setMaxInactiveInterval(10*60);  
也可以在项目的web.xml中设置  代码片段如下:
<session-config>
    <session-timeout>30</session-timeout>       ------这里的单位是分钟  系统默认会话超时是30分钟  0表示失效   -1表示永不超时
</session-config>
 
使整个session会话失效:session.invalidate();
如果只想清空session的某个对象 ,则可以调用session.removeAttribute(String key)方法,将指定的对象从session中清除
此时session对象仍然有效
1、概念:Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象,这个概念到此结束了,也许会很模糊,但只有看完本文,才能真正有个深刻理解。
 
2、Session创建的时间是:
JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
 
引申:
2)、当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:
Cookie:JSESSIONID=客户端第一次拿到的session ID
这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。这也是session使用的基本原理----搞不懂这个,就永远不明白session的原理。
下面是两次请求同一个jsp,请求头信息:
通过图可以清晰发现,第二次请求的时候,已经添加session ID的信息。
 
3、Session删除的时间是:
1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
2)程序调用HttpSession.invalidate()
3)服务器关闭或服务停止
 
4、session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理。
 
5、session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象,对session来说是只认id不认人。
 
6、session会因为浏览器的关闭而删除吗?
不会,session 存在于服务器内存中
 
ServletContext application=this.getServletContext();
            List<User> listUser = (List<User>)application.getAttribute("currentListUser");
            if(listUser == null){
                listUser = new ArrayList<User>();
            }
            listUser.add(user);
            application.setAttribute("currentListUser", listUser);  
 
page作用域:
   在服务器发送响应或请求转发其它页面或资源后无效
   pageContext对象本身也属于page作用域,具有page作用域的对象被绑定到pageContext对象中
request作用域:
session作用域:
    一个浏览器窗口对应一个session对象,当新开一个浏览器窗口时,会重新创建一个session对象
application作用域:
 
 
Cookie:
cookie是由Netscape公司发明的,最常用的跟踪用户会话的方式。它
是由服务器端生成,发送给客户端浏览器的,浏览器会将其保存为某一
个目录下的文本文件,方便下一次请求
cookie的作用:
》》》对特定对象的跟踪:如访问者的访问次数,最后访问时间,路径
》》》统计网页浏览次数
》》》在cookie有效期内,记录用户登录的信息
》》》针对用户的喜好推荐不同的内容
 <%
    //javax.servlet.http.Cookie这个包,当JSP翻译成.java文件时会自动导入
          Cookie c=new Cookie("pwd","123");
          c.setValue("456");
     %>
        <%=
           //c.getMaxAge()----  -1  永不超时 c.setMaxAge(0); 0表示失效
           // c.getPath()----null
           //c.getVersion()---0
          //c.getSecure()//cookie是否安全
        //  c.getName()//只有getName()没有setName(),因为名字不可改
          c.getValue()
         %>  
如果未向cookie中添加数据,当创建session时,sessionid的值cookie的值是一样的,说明sessionid被保存在cookie中
当服务器对一个请求作出处理时,cookie才会被写入客户端
使用setMaxAge(int expiry)时,有以下几种情况:
通常情况下expiry为大于0的整数,表示cookie的有效存活时间
如果设置expiry参数等于0,表示删除cookie
设置expiry参数为负或者不设置,表示cookie会在当前窗口关闭后失效
cookie用于保存不重要的用户信息,重要的用户信息使用session保存
 <%
         response.addCookie(new Cookie("uname","Jack"));
         response.addCookie(new Cookie("pwd","123"));
         response.sendRedirect("look.jsp");
      
       %> 
 
look.jsp
<%
   Cookie[] cookie=request.getCookies();
   String uname=null;
   String pwd=null;
   if(cookie==null){
   out.println("用户名:"+uname+"  "+"密码:"+pwd);
       return;
   }
   
   for(Cookie c:cookie){
       if(c.getName().equals("uname")){
             uname=c.getValue();
       }else if(c.getName().equals("pwd")){
              pwd=c.getValue();
       }
  } 
   out.println("用户名:"+uname+"  "+"密码:"+pwd);
%> 
 

posted on 2020-05-12 18:27  红宝儿  阅读(121)  评论(0编辑  收藏  举报