Jsp内置对象
- request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:
- String getParameter(String name) 返回name指定参数的参数值
- String[] getParameterValues(String name) 返回包含参数name的所有值的数组
- void setAttribute(String, Object) 存储此请求中的属性
- Object getAttribute(String name) 返回指定属性的属性值
- String getContentType() 得到请求体的MIME类型
- String getProtocol() 返回请求用的协议类型及版本号
- String getServerName() 返回接收请求的服务器主机名
--
用户注册表单
<body>
<h1>用户注册</h1>
<hr>
<form name="regForm" action="request.jsp" method="post"">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"> </td>
</tr>
<tr>
<td>
<input type="checkbox" name="favorite" value="read"> 读书
<input type="checkbox" name="favorite" value="music"> 音乐
<input type="checkbox" name="favorite" value="movie"> 电影
<input type="checkbox" name="favorite" value="internet"> 上网
</td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="提交"> </td>
</tr>
</table>
</form>
</body>
request.jsp
<body>
<h1>request内置对象</h1>
<%
request.setCharacterEncoding("utf-8"); //解决中文乱码
%>
用户名:<%= request.getParameter("username") %><br>
爱好:<%
String[] favor = request.getParameterValues("favorite");
for(int i=0; i<favor.length; i++){
out.println(favor[i]+" ");
}
%><br>
请求体的MIME类型:<%= request.getContentType() %><br>
协议类型及版本号:<%= request.getProtocol() %><br>
服务器主机名:<%= request.getServerName() %><br>
服务器端口号:<%= request.getServerPort() %><br>
请求客户端的IP地址:<%= request.getRemoteAddr() %><br>
请求的真实路径:<%= request.getRealPath("request.jsp") %><br>
</body>
- response对象
response对象包含了响应客户请求的有关信息,但在Jsp中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效
常用方法如下:
1. String getCharacterEncoding() 返回响应用的是何种字符编码
2. void setContentType(String type) 设置响应的MIME类型
3. PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
4. sendRedirect(java.lang.String.location) 重新定向客户端的请求
- 请求转发与请求重定向
请求重定性
客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,第一次请求对象不会保存,地址栏的URL地址会改变。
转发请求
服务器行为,request.getRequestDispatcher().forward(req,resp)是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
例如:
login.jsp
response.jsp
<%
response.setContentType("text/html;charset=utf-8");
out.println("<h1>response内置对象<h1>");
//请求重定向
//response.sendRedirect("request.jsp");
//请求转发
//request.getRequestDispatcher("request.jsp").forward(request, response);
%>
request.jsp
- session
session表示客户端与服务器的一次会话
Web中的session指的是用户在游览某个网站时,从进入网站到游览器关闭所经过的这段时间,也就是用户游览这个网站所花费的时间
从上述定义中可以看到,session实际上是一个特定的时间概念
- session对象
session对象是一个Jsp内置对象。
session对象在第一个Jsp页面被装载时自动创建,完成会话期管理。
从一个客户打开游览器并连接服务器开始,到客户关闭游览器离开这个服务结束,被称为一个会话。
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
session对象是HttpSession类的实例。session对象常用方法
- long getCreationTime() 返回Session创建时间
- String getId() 返回session创建时Jsp引擎为它设置的唯一ID号
- void setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话
- Object getAttribute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。
- String[] getValueNames() 返回一个包含此session中所有可用属性的数组
- void setMaxInactiveInterval(int max) 设置session最大生存期限(单位秒)
- int getMaxInactiveInterval() 返回两次请求间隔多长时间此session被取消(单位秒)
--
例如
session_page01.jsp
<h1> session 内置对象</h1> <% SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); session.setAttribute("username", "Jack"); session.setAttribute("password", "11111"); //设置当前session最大生存期限单位是秒 session.setMaxInactiveInterval(5); %> session创建时间<%=sdf.format(session.getCreationTime()) %> <br> session的ID编号<%=session.getId() %> <br> 从session中获取用户名:<%=session.getAttribute("username") %> <br> <a href="session_page02.jsp">跳转到session_page02</a> <br>
session_page02.jsp
<h1>session内置对象</h1> session的ID编号<%= session.getId() %> <br> 从session中获取用户名:<%=session.getAttribute("username") %> <br> session中保存的属性有:<% String names[] = session.getValueNames(); for(int i=0; i<names.length; i++){ out.println(names[i] + " "); } %><br>
- session生命周期
创建
当客户端第一次访问某个Jsp或者Servlet时候,服务器会为当前会话创建一个sessionId,每次客户端向服务器发送请求时,都会将此sessionId携带过去,服务端会对此sessionId进行校验。
活动
- 某次会话当中通过超链接打开的新页面属于同一次会话
- 只要当前会话页面没有全部关闭,重新打开新的游览器窗口访问同一项目资源时属于同一次会话。
- 除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。
- 注意原有会话还存在,只是这个旧的sessionId仍然存在于服务器,只不过再也没有客户端会携带它然后交于服务器校验。
销毁
- 调用session.invalidate()方法
- session过期(Tomcat默认超时时间为30分钟)
- 服务器重新启动
- 实现用户登录(不带数据库的)
用户名admin,密码admin,登录成功使用服务器内部转发到login_success.jsp页面,并且提示登录成功的用户名。如果登录失败,则请求重定向到login_failure.jsp页面。
login.jsp
<body> <h1>用户登录</h1> <hr> <form action="dologin.jsp" name="loginForm" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>密码:</td> <td><input type="password"" name="password"></td> </tr> <tr> <td colspan="2"><input type="submit" value="登录"> </td> </tr> </table> </form> </body>
dologin.jsp
<% String userName = request.getParameter("userName"); String password = request.getParameter("password"); if("admin".equals(userName) && "admin".equals(password)){ session.setAttribute("user", "admin"); //服务器内部转发 request.getRequestDispatcher("login_success.jsp").forward(request, response); }else{ //请求重定向 response.sendRedirect("login_fail.jsp"); } %>
login_success.jsp
<body> <% String user = ""; if(session.getAttribute("user") != null){ user = session.getAttribute("user").toString(); } %> <h1>欢迎<font color="red"><%= user %> </font>登陆成功</h1> </body>
login_fail.jsp
<body> <h1>登陆失败,请检查</h1> <a href="login.jsp">返回</a> </body>