- 请求对象:request
public String getParameter(String name)
示例
HTML代码:
<input type="text" name="userName" />
JSP代码:
String userName= request.getParameter("userName");
比较项 | Get | post |
---|---|---|
参数出现在URL中 | 是 | 否 |
长度限制 | 有 | 无 |
安全性 | 低 | 高 |
URL可传播 | 是 | 否 |
- JSP已经准备好的,可以直接使用的对象
- 请求对象:request
- 输出对象:out
- 响应对象:response
- 应用程序对象:application
- 会话对象:session
- 页面上下文对象:pageContext
- 页面对象:page
- 配置对象:config
- 异常对象:exception
方法名称 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[ ] getParameterValues(String name) | 获取表单组件对应多个值时的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
- JSP中默认使用的字符编码方式:iso-8859-1,不支持中文
- 常见的支持中文的编码方式
编码方式 | 收录的字符 |
---|---|
gb2312 | 常用简体汉字 |
gbk | 简体和繁体汉字 |
utf-8 | 所有国家需要的字符 |
需注意三者编码要一致
<%@ page language="java" contentType="text/html; charset=UTF-8" //在jsp里面运行的java小脚本的编码pageEncoding="UTF-8"%> //servlet读取的编码
//html的编码
Insert title here
- 设置请求和响应的编码方式
- request.setCharacterEncoding(“utf-8”);
- response.setCharacterEncoding(“utf-8”);
- <%@ page language=“java” contentType=“text/html; charset=utf-8”%>
- get请求出现乱码
- 治标的方法:new String( s.getBytes(“iso-8859-1”), “utf-8” );
- 治本的方法:配置tomcat\conf\server.xml文件
- URIEncoding=“UTF-8”
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- 在请求中保存属性
- public void setAttribute(String name,Object o)
- request.setAttribute(“mess”, “注册失败”);
- 在请求中获取属性
- public Object getAttribute(String name)
注意:
- 1、在使用属性值的时候要做非空判断,否则会出现空指针异常
- 2、它的返回值类型是Object类型,需要做数据类型的转换
- 转发
- RequestDispatcher对象
- forward()方法
1、request.getRequestDispatcher("url").forward(request, response)
2、<jsp:forward page="url" />
- 重定向
- 将用户请求重新定位到一个新的URL
response.sendRedirect("url")
比较项 | 转发 | 重定向 |
---|---|---|
URL变化 | 否 | 是 |
重新发出请求 | 不会 | 会 |
是否携带请求 | 是 | 否 |
目标URL要求 | 仅本Web应用 | 任意URL |
注意:重定向是客户端行为,转发是服务器行为
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
Insert title here
dologin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
Insert title here
<% //解决post乱码设置request.setCharacterEncoding("utf-8");String uname = request.getParameter("username");String upwd = request.getParameter("userpassword");String[] fun = request.getParameterValues("fun");/* for (int i = 0; i < fun.length; i++) {out.print(fun[i]+"\t");} */request.setAttribute("uname", uname);request.setAttribute("upwd", upwd);request.setAttribute("fun", fun);//response重定向 不携带参数//response.sendRedirect("index.jsp");//request转发 携带参数request.getRequestDispatcher("index.jsp").forward(request, response); %>
index.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
Insert title here
<%String uname = (String)request.getAttribute("uname");String upwd = (String)request.getAttribute("upwd");String[] fun = (String[])request.getAttribute("fun");out.print(uname + "成功登录,密码是:" + upwd + "爱好是:");for (int i = 0; i < fun.length; i++) {switch (fun[i]) {case "1001":out.print("唱" + "\t");break;case "1002":out.print("跳" + "\t");break;case "1003":out.print("Rap" + "\t");break;case "1004":out.print("篮球" + "\t");break;}}%><%-- <%! //写方法需要用<%!...的形式public void show() {}%><%//简单的逻辑拼接写法List list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");for (int i = 0; i < list.size(); i++) {%>- <%=list.get(i)%>
<%}%> --%>
- 使用会话对象session实现
- 一个会话就是浏览器与服务器之间的一次通话
- 会话可以在多次请求中保存和使用数据
public void setAttribute(String name, Object value);
//用法:
session.setAttribute("userName", "张三丰"); public Object getAttribute(String name);
//用法:
String userName=(String)session.getAttribute("userName");
session的数据是在服务器端的,服务器保存的会话数据量会越来越大,从而导致性能问题
- 若没有清理机制,会导致性能问题或服务器崩溃
- 程序主动清除session数据
- 服务器主动清除长时间没有再次发出请求的session
- 程序主动清除session数据
- 设置会话失效:session.invalidate();
- 移除会话的一个属性
public void removeAttribute(String name);
//用法:
session.removeAttribute("userName");
服务器主动清除长时间没有再次发出请求的session
设置会话过期时间
- 方法一
public void setMaxInactiveInterval(int interval); //单位:秒
- 方法二
<session-config><session-timeout>30</session-timeout> </session-config> //单位:分钟
- cookie以文件方式保存数据
- 添加数据
- public void addCookie(Cookie cookie)
- 获取数据
- public Cookie[] getCookies()
- 设置有效期
- public void setMaxAge(int expiry)
- 用户可以禁用cookie
//cookie的使用
//如果有中文
username = URLEncoder.encode(username,"utf-8");
Cookie cookie = new Cookie("username",username);
//设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
cookie.setPath("/");
//设置cookie生命周期
cookie.setMaxAge(60*60);
response.addCookie(cookie);//获取cookie
Cookie[] cookies = request.getCookies();if(cookies!=null && cookies.length!=0){for(int i=0;i<cookies.length;i++){System.out.println(cookies[i].getName());if(cookies[i].getName().equals("username")){username = cookies[i].getValue();username = URLDecoder.decode(username,"utf-8");}}}
login.jsp:在登录页面进行接收Cookie的操作
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
Insert title here
<%String uname = "";String upwd = "";//用request获取cookieCookie[] cookies = request.getCookies();if (cookies != null && cookies.length != 0) {for (Cookie cookie : cookies) {if (cookie.getName().equals("username")) {//获得cookie值uname = cookie.getValue();//如果其值存在中文,就将其解码uname = URLDecoder.decode(uname,"utf-8");}if (cookie.getName().equals("upwd")) {//获得cookie值upwd = cookie.getValue();}}}%>
dologin.jsp:在处理登录页面进行添加Cookie的设置
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><% //解决post乱码设置request.setCharacterEncoding("utf-8");String uname = request.getParameter("username");String upwd = request.getParameter("userpassword");String[] fun = request.getParameterValues("fun");/* for (int i = 0; i < fun.length; i++) {out.print(fun[i]+"\t");} */if (uname.equals("张三") && upwd.equals("111")) {//设置Cookie//如果Cookie中值存在中文,就将其编码设置成utf-8(也可能因为设置了反而乱码,看具体情况)String username = URLEncoder.encode(uname, "utf-8");Cookie cookie = new Cookie("username",username);//设置路径为根目录(方便使用)cookie.setPath("/");//设置cookie生命周期cookie.setMaxAge(20); //s//添加cookie(response)response.addCookie(cookie);Cookie cookie1 = new Cookie("upwd",upwd);//设置路径为根目录(方便使用)cookie1.setPath("/");//设置cookie生命周期cookie1.setMaxAge(20); //s//添加cookie(response)response.addCookie(cookie1);request.setAttribute("uname", uname);request.setAttribute("upwd", upwd);request.setAttribute("fun", fun);//response重定向 不携带参数//response.sendRedirect("index.jsp");//request转发 携带参数request.getRequestDispatcher("index.jsp").forward(request, response); } else {response.sendRedirect("login.jsp");}%>
</body>
</html>
index.jsp:从dologin.jsp
跳转后显示结果
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
Insert title here
<%String uname = (String)request.getAttribute("uname");String upwd = (String)request.getAttribute("upwd");String[] fun = (String[])request.getAttribute("fun");out.print(uname + "成功登录,密码是:" + upwd + "爱好是:");for (int i = 0; i < fun.length; i++) {switch (fun[i]) {case "1001":out.print("唱" + "\t");break;case "1002":out.print("跳" + "\t");break;case "1003":out.print("Rap" + "\t");break;case "1004":out.print("篮球" + "\t");break;}}%><%-- <%! //写方法需要用<%!...的形式public void show() {}%><%//简单的逻辑拼接写法List list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");for (int i = 0; i < list.size(); i++) {%>- <%=list.get(i)%>
<%}%> --%>
- 分析
- 每个用户都需要使用访问次数
- application可在整个项目中共享使用数据
- 使用application实现计数器
- 每次访问该页面,计数器加1
- 解决方法
- public void setAttribute(String name, Object object)
- public Object getAttribute(String name)
计数器(刷新增加)
<% int i = 1; //设置初始值if (application.getAttribute("num") != null) { //如果存入的值不为空,获取到值了//i则等于上次存入的值(i+1)i = Integer.parseInt(application.getAttribute("num").toString());}//在页面输出增加后的结果out.print(i);//将此次获取到的值+1i++;//将本次获得且增加后的值再次存入,在页面刷新后上面的application.getAttribute可以重新获取到application.setAttribute("num", i);%>
- pageContext、request、session、application
- 相同点
- 都可以存储属性
- 不同点
- pageContext中存储的数据仅在当前页面中可用
- request中存储的数据仅在一个请求中可用
- session中存储的数据在一个会话的有效期内可用
- application中存储的数据在整个Web项目中可用
A.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
我是A页面
我是A页面
<%/*四大作用域pageContext 当前页面request 本次请求session 当前会话application 整个项目(当前服务器开关)*///pageContext 当前页面String uname = "张三";pageContext.setAttribute("uname", uname);//request 本次请求request.setAttribute("uname", uname);//session 当前会话session.setAttribute("uname", uname);//application 整个项目(当前服务器开关)application.setAttribute("uname", uname);//转发request.getRequestDispatcher("B.jsp").forward(request, response);%>
B.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
我是B页面
我是B页面
<% out.print("我是pageContext,我的值为:" + pageContext.getAttribute("uname")); //因pageContext作用域只在当前页面,所以A.jsp的值无法被B.jsp获取到%>
<%out.print("我是request,我的值为:" + request.getAttribute("uname")); %>
<%out.print("我是session,我的值为:" + session.getAttribute("uname"));%>
<%out.print("我是application,我的值为:" + application.getAttribute("uname"));%>
C.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
我是C页面
我是C页面
<% out.print("我是pageContext,我的值为:" + pageContext.getAttribute("uname")); //因pageContext作用域只在当前页面,所以A.jsp的值无法被B.jsp获取到%>
<%out.print("我是request,我的值为:" + request.getAttribute("uname")); %>
<%out.print("我是session,我的值为:" + session.getAttribute("uname")); //因session作用域在当前浏览器,所以关闭当前浏览器页面后才无法获取值(不过当前开多少个浏览器窗口都可以获取到),不过也可以手动设置session会话失效时间//session设置失效时间,5秒后自动清除session,这时session的id也会改变session.setMaxInactiveInterval(5); //单位:秒%> <%out.print("session的id为:" + session.getId());%>
<%out.print("我是application,我的值为:" + application.getAttribute("uname")); //因application作用域只在当前服务器,所以需停止服务器之后才无法获取值%>
D.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
我是D页面
我是D页面
清除session <%//清除session//session.removeAttribute("uname");//清除所有sessionsession.invalidate();%>