JSP数据传递
一、JSP内置对象
1.概念
Web容器创建的一组对象,在页面中可以直接使用。
常用对象有:request、response、session、application、out、page、pageContext、config、exception。
2.对象out
-
数据类型
javax.servlet.jsp.JspWriter
-
作用
向浏览器输出信息,负责管理对客户端的输出
-
用法
<% //在页面上输出内容 out.println("Hello JSP"); %>
3.对象request
-
数据类型
这是接口
javax.servlet.http.HttpServletRequest
-
作用
获取客户端的参数和数据流
-
常用方法
String getParamter(String name); String[] getParamterValues(String name); //设置请求内容的字符集编码 void setCharacterEncoding(String charset); //RequestDispatcher的forward()方法用于转发请求 RequestDispatcher getRequestDispatcher(String path); Cookie[] getCookies(); //获取请求中所有参数和参数值的映射 Map<String, String[]> getParamterMap(); //获取当前对话 HttpSession getSession();
-
示例
<!--向info.jsp提交表单/发送请求--> <form action="info.jsp" method="post"> <div><span>用户名</span><input type="text" name="username"></div> <div><span>密码</span><input type="password" name="password"></div> <div> <span>信息来源</span> <input type="checkbox" name="channel" value="报刊">报刊 <input type="checkbox" name="channel" value="网络">网络 <input type="checkbox" name="channel" value="朋友推荐">朋友推荐 <input type="checkbox" name="channel" value="电视"> 电视 </div> <div> <input type="submit" value="注册"> <input type="reset" value="重置"> </div> </form>
info.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <% request.setCharacterEncoding("UTF-8"); String name = request.getParamter("username"); String password = request.getParamter("password"); String[] channels = request.getParamterValues("channel"); //如果在get请求下字符集是乱码的解决办法 for(String channel : channels){ byte[] bytes = channel.getBytes(StandardCharsets.IOS_8859_1); String s = new String(bytes, StandardCharsets.UTF_8); } %> <div><%= name %></div> <div><%= password %></div> <div><%= Arrays.toString(channels) %></div>
-
get和post请求的区别
- get请求的参数在URL中,post请求的参数在请求体(body)中。
- get请求有数据长度限制,这是浏览器或服务器为提升处理效率而作出的限制,而post请求没有。
- get请求安全性低,因为在url中直接暴露了信息,而post请求安全性高,因为其参数在请求体中,隐藏了信息。
4.对象response
-
数据类型
javax.servlet.http.HttpServletResponse
-
作用
对客户端请求做出回应
-
常用方法
void addCookie(Cookie c); //重定向资源 void sendRedirect(String url); //设置响应状态码 void setStatus(int status); //获取打印流,用于向页面传输数据 PrintWriter getWriter(); //获取输出流,用于图片传输,下载等 ServletOutputStream getOutputStream(); //设置向用户输出数据的字符集编码 void setCharacterEncoding(String charset);
-
示例:实现登录页面跳转,并在跳转页显示登录信息
<form action="process.jsp" method="post"> <div><span>用户名</span><input type="text" name="username"></div> <div><span>密码</span><input type="password" name="password"></div> <div> <input type="submit" value="登录"> </div> </form>
process.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <% String username = request.getParameter("username"); String password = request.getParameter("password"); if("admin".equals(username) && "123456".equals(password)){ //请求不能传递,需要转发 //将收到的请求打包成为一个对象 RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp"); //转发,同时修改页面 dispatcher.forward(request, response); } %>
main.jsp
转发后修改了process.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <% String username = request.getParameter("username"); String password = request.getParameter("password"); %> <div>用户名: <%= username %></div> <div>密码: <%= password %></div>
转发成功后,用户的地址栏信息未发生改变,而页面发送跳转,说明转发发生在服务器,由服务器完成。
5.对象session
-
概念
浏览器与服务器之间的一次通话
-
作用
-
http协议是无状态协议,用户访问服务器时,服务器无法感知用户的具体信息。
服务器通过类
HttpSession
来感知用户,其对象为session。 -
当用户第一次访问服务器时,服务器为该用户产生一个session对象,在对象中生成一个
JSESSIONID
来标识用户,并将其使用Cookie存储在浏览器中,用户的后续操作都将携带这个标识符。 -
session对象有一个超时时间用于计算用户的登录超时,用户的每次操作都将重置这个超时时间。
-
session对象还可以用于存储数据。
-
-
数据类型
javax.servlet.http.HttpSession
-
常用方法
//以键值对形式保存数据 void setAttribute(String key, Object value); Object getAttribute(String key); void removeAttribute(String key); //设置session对象失效 void invalidate(); String getId(); //设置session的非互动时间,单位秒 void setMaxInactiveInterval(int interval); int getMaxInactiveInterval();
-
示例:将用户信息存储于session后重定向
process.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <% String username = request.getParameter("username"); String password = request.getParameter("password"); if("admin".equals(username) && "123456".equals(password)){ session.setAttribute("username", username); session.setAttribute("password", password); response.sendRedirect("main.jsp"); } %>
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <% String username = session.getAttribute("username"); String password = session.getAttribute("password"); %> <div>用户名: <%= username %></div> <div>密码: <%= password %></div>
-
include指令
<%@ include file="文件名"%>
在开发过程中,页面数量很多,如何确保用户的每次操作都是有效操作(在登录没有超时情况下的操作)呢?
编写一个检测用户超时的页面,使用include指令引入每一页。
timeout.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <% String username = session.getAttribute("username"); //当用户超时时,session会被回收,session里面的数据就没有了 //当用户再次发送请求时,浏览器会为用户重新创建一个session对象,用户需要重新登录 if(username == null){ response.sendRedirect("login.jsp"); } %>
-
session超时设置
- Tomcat中web.xml
- 工程中的web.xml
- Java代码实现
6.对象application
-
数据类型
javax.servlet.servletContext
-
作用
实现用户数据共享,将数据保存于服务器中,直到服务器关闭。
-
常用方法
void setAttribute(String key, Object value); Object getAttribute(String key); //获取相对路径的绝对路径 String getRealPath(String path);
-
示例:统计用户的访问次数
<% Integer count = application.getAttribute("count"); if(count == null){ count = 1; }else{ count += 1; } application.setAttribute("count", count); %>
二、Cookie
1.简介
Cookie是Web服务器保存于客户端的文本信息。Cookie机制是在客户端保存状态的方案,又叫会话跟踪机制,用于弥补http协议无状态的不足。
2.作用
- 弥补HTTP无状态协议的不足
- 简化登录,如记住密码、自动登录
3.常用方法
Cookie cookie = new Cookie("name", "value");
//设置Cookie的有效期,单位秒
void setMaxAge(int expiry);
void setValue(String value);
//获取Cookie的名称
void getName();
void getValue();
void getMaxAge();
4.案例
记住密码
<div><input type="checkbox" name="rememberMe">记住密码</div>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
String rememberMe = request.getParamter("rememberMe");
if("admin".equals(username) && "123456".equals(password)){
if(!rememberMe.equals("on"){
String username = "";
String password = "";
String rememberMe = "";
}
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password);
Cookie rememberMeCookie = new Cookie("rememberMe", rememberMe);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
response.addCookie(rememberMeCookie);
response.sendRedirect("main.jsp");
}
%>
自动填充密码
<%
Cookie[] cookies = request.getCookies();
String username;
String password;
boolean rememberMe = false;
for(Cookie cookie : cookies){
String name = cookie.getName();
switch(name){
case "username":
username = cookie.getValue();
break;
case "password":
password = cookie.getValue();
break;
case "rememberMe":
if(cookie.getValue().equals("on")){
rememberMe = true;
}
break;
}
}
%>
<form action="process.jsp" method="post">
<div><span>用户名</span><input type="text" name="username" value=<%= username %>></div>
<div><span>密码</span><input type="password" name="password" value=<%= password %>></div>
<div><input type="checkbox" name="rememberMe" <%=rememberMe ? "checked" : "" %>>记住密码</div>
<div>
<input type="submit" value="登录">
</div>
</form>