当前位置:网络安全 > 【javaweb简单教程】2.JSP实现数据传递和保存(含四大作用域及简单示例)

【javaweb简单教程】2.JSP实现数据传递和保存(含四大作用域及简单示例)

  • 发布:2023-09-15 18:46

2.JSP实现数据传递和保存

获取表单提交的数据

  • 请求对象:request
public String getParameter(String name)
  • 示例

    • HTML代码:

      <input type="text" name="userName" />
      
    • JSP代码:

      String userName= request.getParameter("userName");
      

get与post区别

比较项Getpost
参数出现在URL中
长度限制
安全性
URL可传播

内置对象

  • JSP已经准备好的,可以直接使用的对象
    • 请求对象:request
    • 输出对象:out
    • 响应对象:response
    • 应用程序对象:application
    • 会话对象:session
    • 页面上下文对象:pageContext
    • 页面对象:page
    • 配置对象:config
    • 异常对象:exception

request对象常用方法

方法名称说明
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所有国家需要的字符

jsp表头编码含义

需注意三者编码要一致

<%@ 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

账号:
密码:
爱好:
   唱Rap篮球

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保存用户名

  • 使用会话对象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自动填写用户名

  • 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();}}}%>
账号:
密码:
爱好:
   唱Rap篮球

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可在整个项目中共享使用数据
    • 使用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();%>

相关文章