本文共 12470 字,大约阅读时间需要 41 分钟。
JSP内置对象:JSP自带的,不需要new也能使用的对象
JSP预定义了内置对象原因:提高程序员的开发效率
负责向客户端输入内容
存储客户端向服务端发送的请求信息
javax.servlet.http.HttpServletRequest
根据请求的字段名key(input标签的name属性值),返回字段值value(input标签value属性值)
功能:获取客户端传送给服务器的name参数的值,当传送给此函数的参数名没有实际参数与之对应时返回null
根据请求的字段名key,返回多个字段值value
常见用于checkbox
功能:以字符串数组的形式返回指定参数的所有值
设置请求编码
Tomcat7以前默认编码为ISO-8859-1
Tomcat8以后改为了utf-8请求转发的方式跳转页面 A—>B
获取项目的ServletContext对象
注册页
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
显示页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% request.setCharacterEncoding("utf-8"); String name = request.getParameter("uname"); int age =Integer.parseInt(request.getParameter("uage")); String pwd = request.getParameter("upwd"); String[] hobbies = request.getParameterValues("uhobbies"); %> 注册成功,信息如下: 姓名:<%=name %> 年龄:<%=age %> 密码:<%=pwd %> 爱好: <% if(hobbies != null) { for(String hobby :hobbies) { out.print(hobby+" "); } } %>
get提交方式:method=“get” 和地址栏、超链接(a href=“xxx”)请求方式默认都属于get提交方式
结构:连接/文件? 参数名1=参数值1 & 参数名2=参数值2 & 参数名3=参数值3
地址栏提交方式http://localhost:8080/yanqunJSP/show.jsp?uname=zs&upwd=123&uage=15&uhobbies=%E7%AF%AE%E7%90%83&uhobbies=%E4%B9%92%E4%B9%93%E7%90%83
get与post请求方式的区别
get方式在地址栏显示请求信息(但是地址栏能够容纳信息有限4-5KB, 如果请求数据存在大文件、图片、视频,会出现地址栏容纳不下报错) post不会显示、文件上传操作必须是post(推荐使用)
如果出现乱码
解决:
方法一:统一每一个变量的编码(麻烦,不推荐)new String(旧编码,新编码)
方法二:修改server.xml,一次性修改Tomcat默认get提交方式的编码(utf-8)
在修改端口号的地方,后面加上URIEncode="utf-8"
如果出现乱码
解决:
设置post方式编码:request.setCharacterEncoding(“utf-8”) 这个只适用于post方式请求编码这个方法缺点是:只能解决当前页面的乱码问题
过滤器:
想要对整个web应用进行统一编码 可以使用过滤器进行统一的过滤,比较方便响应对象
服务端向客户端增加一个cookie对象
设置服务端响应时的编码,设置服务端的contentType类型
页面跳转的一种方式(重定向)
login.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
check.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% request.setCharacterEncoding("utf-8"); String name = request.getParameter("uname"); String pwd = request.getParameter("upwd"); if(name.equals("zs")&&pwd.equals("abc")) { //假设是zs、abc //方式一:页面跳转:重定向会导致数据丢失 //response.sendRedirect("main.jsp");//这里面是相对路径 //方式二:页面跳转 请求转发,可以获取到数据,并且地址栏没有改变(仍然保留转发时的页面check.jsp) request.getRequestDispatcher("main.jsp").forward(request, response); } else { //登录失败 out.print("用户名或密码有误!"); } %>
mian.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here 登录成功! 欢迎你: <% String name = request.getParameter("uname"); out.print(name); %>
地址栏是否改变
请求转发:不变
forward方法属于服务器端去请求资源,服务器直接访问目标地址, 并对该目标地址的响应内容进行读取,再把读取内容发给浏览器。
重定向:改变
Redirect告诉客户端,使浏览器去请求哪一个地址,相当于客户端从新请求一遍。
是否保留第一次请求时的数据
请求转发(forword):保留
重定向(redirect):不保留请求的次数
请求转发:1次 重定向:2次跳转发生的位置
请求转发:服务端
重定向:客户端发出的第二次跳转转发、重定向实例:
转发:张三(客户端) -> [服务窗口A(服务端)——>服务窗口B ]
重定向:
张三(客户端) -> 服务窗口A(服务端)——> 去找B 张三(客户端) -> 服务窗口B(服务端)——> 结束
session(服务端)
cookie(客户端,不是内置对象)session对应类(接口)是:javax.servlet.http.HttpSession
由服务端生成,再发送给客户端保存
相当于本地缓存的作用:客户端(hello.mp4;zs/123)——>服务端(hello.mp4;zs/123)
提高访问服务端的效率,但是安全性较差
Cookie:key=value
Cookie对象由javax.servlet.http.Cookie产生
产生完cookie放在以下方法里面去:
response.addCookie(Cookie cookie)发送给客户端:
页面跳转(转发、重定向)客户端获取cookie:
request.getCookies();注意:
服务端增加cookie:response对象客户端获取对象:request对象获取只能获取全部的cookie,不能获取单独对象
通过F12可以发现,除了自己设计的Cookie对象外,还有一个name为JSESSIONID的cookie
每一个cookie都有一个JSESSIONID了解Cookie的工作流程
response_addCookie.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% //服务端 Cookie cookie1 = new Cookie("name","zs"); Cookie cookie2 = new Cookie("pwd","abc"); response.addCookie(cookie1); response.addCookie(cookie2); //页面跳转到客户端(转发、重定向) response.sendRedirect("result.jsp"); %>
result.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% //客户端获取cookie(获取所有的cookie) Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies) { out.print(cookie.getName()+"---"+cookie.getValue()+""); } %>
使用Cookie实现 记住用户名功能
了解cookie最大有效期的方法,进行代码实现。
cookie不是绝对的安全,用户名、密码保存在cookie中,当cookie被盗取就会暴露了
盗取cookie的方法:
1.利用跨站脚本技术,将信息发送给目标服务器2. 通过某些软件盗取硬盘下的cookie
cookie能够持久化保存
cookie可以帮助服务器保存多个状态信息,但不用服务器分配专门存储资源 cookie可以持久保持一些和客户相关的信息一次会话:从一次开始——>一次结束
a. 浏览网站:从开始——>关闭就是一次会话
b. 购物: 从浏览、付款、退出就是一次会话 c. 电子邮件:浏览、写邮件、退出就是一次会话客户端第一次请求服务端时,(JSESSIONID——sessionid匹配失败),服务端会产生一个session对象(用于保存该客户的信息);
并且每个session对象 都会有一个唯一的sessionId(用于区分其他session) 服务端又会产一个cookie,并且该cookie的name(key)=JSESSIONID,value=sessionId的值; 然后服务端会在响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了一个cookie(里面是JSESSIONID); 因此客户端的cookie就可以和服务端的session一一对应起来(cookie的JSESSIONID和session的sessionID对应)客户端第二/n次请求服务端时,服务器会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid,如果匹配成功(cookie的JSESSIONID和session的sessionid值相同),说明此用户不是第一次访问,无需登录;
session在用户登录的时候创建
注:例子:
客户端:顾客(客户端) 服务端:存包处——商场(服务端)顾客第一次存包:商场判断此人是否之前已经存过包(通过你手里面是否有钥匙)
如果是新顾客(没钥匙),分配一个钥匙给该顾客:钥匙会和柜子一一对应第二次/n次存包:商场判断此人是否之前已经存过包(通过你手里面是否有钥匙)
如果是老顾客(有钥匙),则不需要分配,该顾客手里面的钥匙会和柜子自动一一对应起来属性操作
登录
同一个浏览器可以共用一个session
login.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here
check.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% request.setCharacterEncoding("utf-8"); String name = request.getParameter("uname"); String pwd = request.getParameter("upwd"); if(name.equals("zs")&&pwd.equals("abc")) { //只有登录成功,session中才会存在uname/upwd session.setAttribute("uname", name); session.setAttribute("upwd", pwd); //控制台打印输出看看sessionID System.out.println("sessionId:"+session.getId()); //服务端产生完cookie,发送给客户端 //Cookie cookie = new Cookie("uname",name); //response.addCookie(cookie); //服务端在第一次响应客户端时,会自动发送一个JSESSIONID的cookie request.getRequestDispatcher("welcome.jsp").forward(request, response); //session.setMaxInactiveInterval(10); //有效非活动时间10s,(10s内没有进行操作就需要重新登录) } else { //登录失败 response.sendRedirect("login.jsp"); } %>
welcome.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here 欢迎您!: <% String name = (String)session.getAttribute("uname"); //如果用户没有登录,而是直接通过地址栏访问welcome.jsp,则必然获取到的name是null //如果没有登录,应该跳回登录页 if(name!=null) { out.print(name); %> 注销 <% } else{ response.sendRedirect("login.jsp"); } %>
a.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here <% out.print(session.getAttribute("uname")); Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies) { if(cookie.getName().equals("JSESSIONID")) { //打印看看控制台的JSSSIONID和sessionID是否对应 System.out.println("JSESSIONID:"+cookie.getValue()); } } %>
invalidate.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>注:Insert title here <% session.invalidate(); //一次性将session全部失效 response.sendRedirect("login.jsp"); //session.removeAttribute("uname");//将用户名失效 %>
客户端在第一次请求服务端时,如果服务端发现,此请求没有JSESSIONID,则会创建一个拥有name=JSESSIONID的cookie 并返回给客户端
cookie:
不是内置对象,要使用必须new 但是,服务端会自动生成一个(服务端自动new一个cookie)name=JSESSIONID的cookie 并返回给客户端保存的位置
session:服务端
cookie:客户端安全性
session:较为安全
cookie:较不安全保存的内容
session:Object
cookie:String实现页面被访问次数的统计
pageContext JSP页面容器对象 (page对象)
范围:当前页面有效
request 请求对象
范围:同一次请求有效
session 会话对象
范围:同一次会话有效
application 全局对象
范围:全局有效(整个项目有效)
Object getAttribute(String name):根据属性名,获取属性值
void setAttribute(String name, Object obj):设置属性值(新增,修改)
setAttribute("a", "b");//如果a对象之前不存在,则新建一个a对象; //如果a之前已经存在,则将a的值改为b
void removeAttribute(String name);根据属性名,删除对象
页面跳转后无效
请求转发后有效;重定向后无效
无论怎么跳转,都有效;
关闭/切换浏览器后无效; 从登录到退出之间全部有效全局变量
切换浏览器任然有效
对个项目共享、重启后仍然有效LJNDI
这种是最常见的,设置编码的位置位于JSP的第一行,如果在Eclipse中新建一个JSP默认是下面这种:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
它默认的页面编码和传输编码都是ISO-8859-1,这是用于欧洲国家的编码。
可以通过设置Eclipse中JSP的编码格式,来修改默认生成的编码格式。如果想要支持中文,可以使用UTF-8、GB2312、GBK等,其中UTF-8是国际化的,哪个国家的都支持。
上面涉及到编码的两个地方:charset 和 pageEncoding
charset是指服务器发往客户端展现时的编码;
pageEncoding用于设置JSP页面本身的编码。JSP在部署后提供给用户使用,会经过三个阶段:
1 JSP生成java文件:这个阶段会使用pageEncoding所定义的编码格式进行转换
2 java文件生成class文件:这个阶段由服务器tomcat自动使用utf-8编码把java文件转换成字节码class文件
3 通过读取class文件展现给用户:这个阶段由tomcat服务器获取字节码内容,通过使用contentType所定义的编码格式展现给用户。
大致过程如下图:
可以这样设置:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
因为JSP中也包含HTML的内容,HTML本身也是有编码格式的。
Insert title here
如果这部分编码出现问题,那么HTML中标签的中文命名就会出现乱码。
HTML中因为只涉及到表现层,所以只有一个属性content中charset,这个编码格式设置对了,就没问题了。
有时候在做jsp逻辑处理时,比如提交表单,从前台注册的页面提交了一部分的数据,但是后面处理的JSP页面
通过 request.getParameter 调用时,获取到的是一堆乱码。
这是因为虽然前面JSP设置了编码格式,却没有在当前的JSP中设置读取数据的编码格式。
使用下面的代码,就可以是设置request获取请求内容的数据编码:
request.setCharacterEncoding("UTF-8");
需要注意的是,这种方式对 URL传参这种JSP请求 是没有作用的。比如:
url test request(en)url test request(zh)
这种情况仍然会出现乱码,这种URL传参的方式,只能修改服务器tomcat的传输编码格式。
修改tomcat安装文件 apache-tomcat-6.0.43\conf 目录下的server.xml
response输出页面元素内容时,也会出现乱码。
使用下面代码就可以设置response输出的编码格式:
response.setContentType("text/html;charset=UTF-8");response.setCharacterEncoding(“UTF-8”)的作用是指定服务器响应给浏览器的编码。 response.setContentType(“text/html;charset=utf-8”)的作用是指定服务器响应给浏览器的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。
Cookie由于需要保存在客户端中,因此使用过程中都需要编码以及转码:
在保存Cookie数据前首先引入java.net.*,该包中包含URLEncoder类;保证response与request的编码正确;使用URLEncoder进行转码,并保存。
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.net.*" pageEncoding="UTF-8"%><%//保证request以及response的编码 request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8"); //使用URLEncoder解决cookie中中文问题String username = URLEncoder.encode(request.getParameter("username"),"UTF-8");String password = URLEncoder.encode(request.getParameter("password"),"UTF-8"); Cookie usernameCookie = new Cookie("username",username);Cookie passwordCookie = new Cookie("password",password);usernameCookie.setMaxAge(864000);passwordCookie.setMaxAge(864000); response.addCookie(usernameCookie);response.addCookie(passwordCookie);%>
在使用Cookie数据前
依然要注意导入必备的包:java.net.*
注意request的编码;
使用URLDecoder进行解码
转载地址:http://rmxzi.baihongyu.com/