JSP --- data exchange [1]

JSP's built-in objects do not have a statement on the possible use JSP pages

 

 

 

The request object

Built-in object request encapsulates the user information submitted , mainly for processing client requests

<FORM action="tom.jsp" method= “post” >

<INPUT type="text" name="boy" value= “ok” >

<INPUT TYPE="submit" value=" 送出" name= “submit”>

</FORM>

 

Tom.jsp file request objects may be used getParameter (String s) method to obtain this form by text information submitted. such as:

request.getParameter(boy);

 

 

The request object common methods

request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据接收数组变量,如checkobx类型

request.getParameterString name)是获得相应名的数据,如果有重复的名,则返回第一个的值. 接收一般变量,如text类型

 

简例:

学生注册页面

<form name="form1" method="post" action="reginfo.jsp">
    <table border="0" align="center">
      <tr> <td>用户名</td><td> <input type="text" name="name"></td></tr>
      <tr><td>密码</td><td > <input type="password" name="pwd"> </td></tr>
      <tr> <td>信息来源</td><td> 
          <input type="checkbox" name="channel" value="报刊">报刊 
          <input type="checkbox" name="channel" value="网络">网络 
          <input type="checkbox" name="channel" value="朋友推荐"> 朋友推荐 
          <input type="checkbox" name="channel" value="电视"> 电视
        </td></tr>
       <!--省略提交、取消按钮 -->
    </table>
</form>

reginfo.jsp

<%
    //读取用户名和密码
    String name = request.getParameter("name");
    String pwd = request.getParameter("pwd");
    ……//HTML页面
    //读取复选框选择项
    String[] channels = request.getParameterValues("channel");
    if (channels != null) {
for (String channel : channels) {
out.println(channel);
}
    }
%>

结果发现都是乱码

 

中文乱码解决办法:

  1. 在页面设置支持中文字符的字符集,如:UTF-8
  2. 获取数据时解决中文乱码问题

也可以将获取的字符串用 ISO-8859-1 进行编码,并将编码存放到一个字节数组中,然后再将这个数组转化为字符串对象即可。如下列所示:

String str=request.getParameter("girl");

byte b[]=str.getBytes( “ISO-8859-1”);

str=new String(b);

 

【在接收验证信息的文件中】

先执行setCharacterEncoding方法然后再执行getParameter()方法取值才有效

 

response

作用:对客户的请求作出动态响应,向客户端发送数据

Response对象其实就是servlet中的HttpServletResponse的封装

 

 

 

页面重定向

void sendRedirect(String location) 客户端将重新发送请求到指定的URL

<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("userName");
String pwd = request.getParameter("pwd");
if ("sa".equals(name) && "sa".equals(pwd))           
response.sendRedirect("welcome.jsp"); //匹配后,跳转至欢迎页面 %>

 

 

使用转发实现页面跳转

 实现页面跳转后,请求信息不丢失

 

转发的作用

 

在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理

转发的实现

RequestDispatcher对象的forward()方法

 

 

 

 会话

 一个会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程

当一个客户首次访问服务器上的一个 JSP 页面时,JSP 引擎产生一个 secssion 对象,

这个 session 对象调用相应的方法可以存储客户在访问各个页面期间提交的各种信息,比

如,姓名、号码等信息。这个 session 对象被分配了一个 String 类型的 Id 号,JSP 引擎

同时将这个 Id 号发送到客户端,存放在客户的 Cookie 中。这样,session 对象和客户之

间就建立起一一对应的关系,即每个客户都对应着一个 session 对象(该客户的会话),

这些 session 对象互不相同,具有不同的 Id 号码。我们已经知道,JSP 引擎为每个客户启

动一个线程,也就是说,JSP 为每个线程分配不同的 session 对象。当客户再访问连接该

服务器的其它页面时,或从该服务器连接到其它服务器再回到该服务器时,JSP 引擎不

再分配给客户的新 session 对象,而是使用完全相同的一个,直到客户关闭浏览器后,服

务器端该客户的 session 对象被取消,和客户的会话对应关系消失当客户重新打开浏览

器再连接到该服务器时,服务器为该客户再创建一个新的 session 对象

 

Session对象在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效

 

 

page指令配置如下信息,session对象将不可使用

    <%@page session="false" %>

 

 

session 对象能和客户建立起一一对应关系依赖于客户的浏览器是否支持 Cookie。如

果客户端(浏览器)不支持 Cookie,那么客户在不同网页之间的 session 对象可能是互不相同的,因为服务器无法将 Id 存放到客户端,就不能建立 session 对象和客户的一一对应关系

 

session 对象的常用方法:

(1) public void setAttribute(String key ,Object obj)

session 对象调用setAttribute方法将对象 obj添加到 session 对象中,如果添加的两个对象的关键字相同,则先前添加的对象被清除

(2) Object getAttibue(String key)

 

如果客户的浏览器不支持 Cookie,我们可以通过 URL 重写来实现 session 对象的唯

一性

所谓 URL 重写,就是当客户从一个页面重新连接到一个页面时,通过向这个新的

URL 添加参数,把 session 对象的 Id 传带过去,这样就可以保障客户在该网站各个页面

中的 session 对象是 完 全 相 同 的。可以使用 response 对象 调 用 encodeURL()

encodeRedirectURL()方法实现 URL 重写,比如,如果从 tom.jsp 页面连接到 jerry

面,首先实现 URL 重写:

String str=response.encodeRedirectURL("jerry.jsp");

然后将连接目标写成<%=str%>

 

 

 

session对象常用方法:

 

session窗口的关系

  1. 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象
  2. 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同

 

使用session实现访问控制

 1.在控制页面获取用户请求的登录信息进行验证

<%
if ("admin".equals(name) && "admin".equals(pwd)) {  // 如果是已注册用户
session.setAttribute("login", name);     //在session 中存放用户登录信息
 // 设置session过期时间
session.setMaxInactiveInterval(10*60);
request.getRequestDispatcher("admin.jsp").forward(request, response);
} else {
response.sendRedirect("index.jsp");
} 
%>

2.在管理页面增加登录验证

<%
String login = (String) session.getAttribute("login");
if (login == null) {
    response.sendRedirect("index.jsp");
    return;
} %>                  //如果session中不存在用户的登录信息,转入登录页面

session.getAttribute(String key)方法的返回值是一个Object,必须进行强制类型转换

 

 

 

session对象的失效

 

 

 

 include指令

Include指令是 静态包含

静态包含:

因为include包含了head.jspfoot.jsp文件,所以在执行1.jsp文件时会head.jspfoot.jsp文件的代码内容包含进来,然后再编译! 

因此,插入head.jspfoot.jsp文件后,必须保证新合并成的JSP 页面符合 JSP 语法规则,即能够成为一个 JSP 页面文件。比如,如果一个 JSP 页面使用 include 指令插 入另一个 JSP 文件,被插入的这个 JSP 页面中有一个设置页面contentType 属性的 page 指令:

<%@ page contentType="text/html;charset=GB2312" %>

而当前 JSP 页面已经使用 page 指令设置了 contentType 的属性值,那么新合并的JSP页面就出现了语法错误,当转译合并的 JSP 页面到 Java 文件时就会失败.

 

前提条件:head.jspfoot.jsp文件必须和1.JSP 页面在同一 Web 服务目录中。

 

 

另一种包含文件的方式:JSP行为动态包含

JSP行为(也叫:jsp标签)是一组JSP内置的标签JSP标签是对常用的JSP功能的抽象和封装

 

  • 其实include标签就是封装了request.getRequestDispatcher(String url).include(request,response)
  • include标签语法是这个样子的
<jsp:include page="文件的名字"/><jsp:include page= “文件的名字”> </jsp:include>

 

例如:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>包含页头和页尾进来</title>
    </head>
    <body>
        <jsp:include page="head.jsp"/>
        <jsp:include page="foot.jsp"/>
    </body>
    </html>

说明:

动态包含是:先编译被包含的页面(head.jsp和foot.jsp文件),再将结果写入到包含的页面中(1.jsp)

现在有静态包含和动态包含,使用哪一个更好呢?答案是:动态包含

因为动态包含是将被包含页面分别编译后得出的结果再写进包含页面,可以避免报错【如果head.jsp和foot.jsp文件有相同名称的变量,使用静态包含就会报错!】

注意

书写 include 动作标签:<jsp:include page …../>时要注意:“jsp”、“:”、

“include”三者之间不要有空格。

 

 

 如果其它页面中同样需要加入登录验证————可将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件

 

1.创建登录验证文件 loginControl.jsp

<%
String login = (String) session.getAttribute("login");
if (login == null) {
  response.sendRedirect("index.jsp");
    return;
} %>

2.引用登录验证文件

<%@  include file="loginControl.jsp" %>

 

 

 

 

 

 

 

 

out 对象

out对象是一个输出流,用来向客户端输出数据。与之对应的是Servlet的PrintWriter对象

 

out.print(long)out.println(long) :输出一个长整型数据。

out.print(String)out.println(String) :输出一个字符串对象的内容。

out.newLine() :输出一个换行符

out.flush() :输出缓冲区里的内容

out.close() :关闭流

 

只有向out对象中写入了内容,且满足如下任何一个条件时内容真正写入到Servlet中。

  • 设置page指令的buffer属性关闭了out对象的缓存功能
  • out对象的缓冲区已满
  • 整个JSP页面结束

一般我们在JSP页面输出都是用表达式(<%=%>),所以out对象用得并不是很多

 

Guess you like

Origin www.cnblogs.com/expedition/p/11200672.html