版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 Servlet1 什么是 ServletServlet 是专门用来接收客户端以把数据传给客户端。过来的请求的 web 小程序,并且它还可2 Servlet 的生命周期1调用构造器,创建 Servlet第一次请求时被调用,即第一次发请求时创建 Servlet 对象在整个生命周期过程中只被调用一次,说明 Servlet 是单例2调用 Servlet 的 init 方法,初始化第一次请求时被调用,对 Servlet 对象进行一些初始化的操作而且在整个生命周期过程中只被调用一次3调用 Servlet 的 service 方法,处理请求每次请求时都会被调用,用来处理用户的请求,并给用户响应在整个生命
2、周期中会被调用多次4调用 Servlet 的 destory 方法,销毁 Servlet在关闭服务器时被调用,对 Servlet 对象做一些收尾的工作在整个生命周期中只被调用一次3 Servlet 类的继承体系4 ServletConfig 接口1 代表当前 Servlet 的配置信息2 作用:1、获取 Servlet 的初始化参数 getInitParameter(“”); 2、获取 Servlet 的名称 getServletName()3、获取 ServlerContext 对象5 ServletContext 接口1 代表当前 Web 应用一个 ServletContext 对应一个
3、Web 工程。所有的 ServletServletContext 都是同一个对象。方位 2 作用:1、获取当前 Web 应用的初始参数<context-parama>获取:ServletContext context = getServletContext(); context.getInitParameter();2、获取服务器端的真实路径(文件的上传会用到)context.getContextRealPath();3、它是一个域对象(它保存的属性数据 整个工程内共享)4、获取工程文件夹或文件在服务器硬盘上的绝对路径context.getRealPath();5、获取或设置全局的
4、共享属性context.setAttribute(key,value) 设置全局的共享属性context.getAttribute(key) 获取属性context.removeAttribute(key) 移除属性6 HttpServletRequest 类1 参数 request 代表浏览器给服务器的请求报文他封装了客户端过来的所有请求信息该对象由服务器创建并以参数的形式传入到 doGet 和 doPost 方法中,在这两个方法中可以直接使用常用方法:获取请求的获取请求的统一路径getRequestURI()getRequestURL() getRemoteHost() getHeader
5、() getParameter() getParameterValues()选)。符获取请求的客户端 ip 地址获取请求头信息获取请求参数值(只能获取请求参数的一个值)获取请求的多个值(常用于复选框和下拉列表多获取请求的转发对象。转发请求(转发的请求和getRequestDispatcher()原请求共享 request 对象和 response 对象)获取请求的方式 GET 或 POSTgetMethod()setAttribute(key, value);设置 Request 请求范围的属性值。获取 Request 请求范围的属性值。获取 Cook 对象获取或创建 Session 对象ge
6、tAttribute(key);getCookies() getSession()2 request 作用1、获取请求参数 getParameter()2、获取当前 Web 应用的虚拟路径 getContextPath3、转发getRequestDispatcher(路径).forward(request,response); 4、它还是一个域对象7 HttpServletResponse 类1 response 代表服务器给浏览器的响应报文该对象由服务器创建并以参数的形式传入 doGet 和 doPost 方法2 作用:1、给浏览器响应一个页面或者页面的一个片段getWriter 获取一个打
7、印流2、重定向sendRedirect(路径)8 转发和重定向的区别1. 转发只发一次请求;重定向要发两次请求2.转发可以WEB-INF 下的内容;重定向则不可以3.转发浏览器地址栏无变化;重定向地址栏后追加重定向到的地址4.转发可以共享 request 域中的;重定向不可以request 域中的资源9 中文乱码问题1 get 请求中文乱码1 乱码的根本原因:浏览器的编码方式 UTF-8 和 服务器的方式ISO-859-1不一样转发重定向浏览器地 址栏变化会变化Request同一个请求两次请求APIRequest 对象Response 对象位置服务器内部完成浏览器完成WEB-INF可以不能共享
8、request 请求域数据可以共享不可以共享目标必须是当前 Web 应用中的资源不局限于当前 Web 应用2 解决方法:1) 第式 使用 URLEncoder 和 URLDecoder两个类编。先以iso-8895-1 进行编码,然后再以 utf-8 进行2) 第二种方式 使用 String 类的方法进行编username = new String(username.getBytes("ISO-8859-1"),"UTF-8");/获取客户端传递过来的用户名参数值String username = request.getParameter("u
9、sername"); System.out.println("用户名:" + username);/ 先对用户名进行得到%E7%8E%8B%E6%8C%AF%E5%9B%BD 这样的形式username = URLEncoder.encode(username, "ISO-8859-1");/ 再进行 utf-8 编码 一次得到页面上输入的文本内容username = URLDecoder.decode(username, "UTF-8"); System.out.println("乱码解决后用户名:"
10、+ username);3) 第三种方式 更改 server.xml 配置文件。GET 请求是在URL 地址栏中传递请求参数的,它会被Tomcat 服务器自动而 Tomcat 服务器默认的字符集也是 ISO-8859-1,所以我们需要修改 Tomcat 服务器的字符集为 UTF-8。由于请求参数是包含在请求行内的,无法通过 request 对象进行设置,所以需要在 Server.xml 文件中修改 Connector,添加 URIEncoding="utf-8"属性。在 eclipse 中的Tomcat镜像中修改即可生效。但如果将来删除当前 Tomcat 镜像,重新关联 T
11、omcat,则会使设置失效,所以在 Tomcat 配置文件中最好也进行配置。2 post 请求中文乱码问题1、post 请求方式乱码的原因是:因为 post 是以二进制流的形式器。服务器收到数据后。默认以 iso-8859-1 进行编码。到的服务2 、 post 请 求 乱 码 解 决 , 只 需 要 在 获 取 请 求 参 数 之 前 调 用request.setCharacterEncoding("UTF-8"); 方法设置字符集 即可。protected void doPost(HttpServletRequest request, HttpServletRespon
12、se response) throws ServletException,IOException / 1.post 请求方式的数据是以二进制流的形式到服务器。/ 2.那么就说明它缺少一个字符集。所以我们要设置请求体的字符集即可。/ setCharacterEncoding 必须要获取请求参数之前调用才有效request.setCharacterEncoding("UTF-8");/获取客户端传递过来的用户名参数值String username = request.getParameter("username"); System.out.println(&
13、quot;用户名:" + username);System.out.println("乱码解决后用户名:" + username);3 响应乱码1、原因: 由服务器编码,默认使用 ISO-8859-1 进行编码由浏览器,默认使用 GBK 进行2、解决方案方法 1:设置响应头response.setHeader("Content-Type","text/html;charset=utf-8"); 方法 2:设置响应的内容类型response.setContentType("text/html;charset=utf-
14、8");通过这种方式可以在响应头中告诉浏览器响应体的编码方式是 UTF-8;同时服务器也会采用该字符集进行编码但需要注意的是,两种方法一定要在 response.getWriter()之前进行。10 Web 应用中的路径问题在 Web 应用中,为了避免找不到的问题,推荐使用绝对路径1 什么是绝对路径:以“/”开头的路径。2 绝对路径怎么写由浏览器:开头的“/”表示当前服务器主机地址,例如:哪些地址由浏览器?HTML例如:超中的地址。href 属性、表单 action 属性、图片和 script 的 src 属性重定向中的地址。由服务器:开头的“/”表示当前 Web 应用,例如: 哪些
15、地址由服务器请求转发中的地址web.xml 文件中 url-pattern配置的 URL3 base 的作用<base href=”工程名/包名/文件名” />base可以设置当前相对路径的参照,即可以表示为绝对路径,防止了相对路径中服务转发时,找不到路径2 一个 Web 工程的设计1 软件的开发流程3 JSP1 为什么使用 JSPHTML 页面优点:可以很好的显示页面。缺点:不能处理用户的请求Servlet 优点:可以处理用户的请求并给用户响应,但是不擅长显示页面将 HTML 和 Servlet 的优点结合,出现 JSP,即 HTML+Servlet=JSP2 JSP 简介全称:
16、Java server pages ,Java 服务页面JSP 页面不能脱离服务器单独运行,JSP 页面必须运行在服务器上JSP 是可以写 Java 代码的 HTML 页面3 JSP 基本语法1.JSP 模板元素:跟 HTML 使用一样2 JSP片段:格式:<% Java 代码 % >作用:JSP片段专门用于在 JSP 中Java 代码的在 JSP 页面中可以写多个片段,但是要保证多个片段的拼接完整性。3 JSP 表达式:格式:<%=%>作用:用来将一个对象输出到页面4 JSP 注释:JSP 页面可以写三种注释HTML 注释:<!-> :浏览器JSP 页面时
17、,才忽略注释。存活时间最长Java 注释:/*/略。存活时间中JSP 注释:<%- 存活时间最短:Java 虚拟机将 Java 文件编译成 class 文件时忽-%> :JSP 引擎将 JSP 文件翻译成 Java 文件时忽略。4 JSP 中常用的指令格式:<% 指令名 属性名 1="属性值 1" 属性名 2="属性值 2"%>1 page 指令:用来告诉服务器如何当前页面language 属性:用来指定当前页面使用的编程语言,默认值 java,可选值也是 java,只有 JavacontentType 属性:用来告诉浏览器使用什
18、么字符集来pageEncoding 属性:用来设置当前页面使用的字符集当前页面errorPage 属性:用来设置当前页面出现异常时要转发的页面isErrorPage:用来设置当前页面是否是一个错误页面。默认 false。该属性为 true 时 ,当前页是一个错误页面。可以使用 exception对象获取异常信息import 属性:用来导包的,我们通常重新写一个 page 指令专门使用 import属性导包isElIgnored 属性:用来设置是否获取 EL 表达式,默认 false 不忽略,一般不改session 属性:用来设置当前页面中是否可以使用 session 对象,默认值是true,可
19、以使用,一般不改2 include 指令:用来将某个页面中的内容,包含到当前页面中file 属性:用来设置被包含的页面的地址通过 include 指令进行的包含称为静态包含3 taglib 指令:用来添加库5 JSP 中的动作格式:<jsp: JSP 的动作名 属性名="属性值"></jsp:名>由服务器,这些时会转换为相应的 Java 代码JSP 中常用的动作:(1)forward:用来进行请求的转发,可以携带请求参数<jsp:forward page="/index.jsp">/携带请求参数<jsp:para
20、m value="admin" name="username"/></jsp:forward>page 属性:用来设置要转发到的页面的地址注意:如果在转发时没有携带请求参数,转发的体中不能包含任何内容(2)include称这种包含为动态包含:用来将某一个页面中的内容包含到当前页面中,我们<jsp:include></jsp:include>静态包含和动态包含的区别1静态包含:多个 jsp 文件只会生成一个 jsp Java 程序主文件将包含的内容原封不动的包含进来因为生成了一个文件,所以不能在多个文件中 和方法动
21、态包含:多个 jsp 文件会生产多个 jsp Java 程序主文件将包含文件的执行结果包含进来因为生成了多个文件,所以可以在多个文件中和方法相同的变量2相同的变量1. 静态包含只翻译,编译包含页面,不翻译、编译被包含的页面。动态包含既可以翻译、编译两个页面2. 如果被包含的页面是一个静态页面,我们使用静态包含如果被包含的页面是一个动态页面,使用动态页面,使用不多6 JSP 中的九大隐含对象隐含对象:即不用在 JSP 页面中就可以直接使用的对象JSP 中的九大隐含对象之所以在 JSP 页面中可以直接使用是因为在 JSP 页面对应的类中的_jspService()方法中已经这些对象,并对它们赋值1
22、.pageContext类型:PageContext作用:一个顶九个,通过它可以获取其他隐含对象它还是一个域对象2.request类型:HttpServletRequest作用:和 Servlet 中的 request 作用一样,它还是一个域对象3.session类型:HttpSession作用:它是一个域对象4.application类型:ServletContext作用:它是一个域对象5.response类型:HttpServletResponse作用:和 Servlet 中的 response 作用一样,在 JSP 中基本不用6.config类型:ServletConfig作用:可以获取
23、 JSP 的初始化参数(配置信息)7、out类型:JspWriter作用:和 PrintWriter 的作用一样,可以给浏览器一个响应8、page类型:Object作用:相当于 this,代表当前对象,没用9、exception类型:Throwable作用:获取异常信息,前提是 page 指令中的 isErrorPage 属性设置为true7 四个域对象域对象的含义:域即区域或范围,在 JavaWeb 中指不同的 Web(html、jsp、Servlet)不同的 Web之间需要共享数据,所以就有了域对象JavaWeb 中有四个域对象,分别是:pageContext,request,sessio
24、n,application1 四个域对象都有以下三个方法:void setAttribute(String key,Object value )/向域对象中添加属性Object getAttribute(String key)/根据属性名获取在域对象中添加的属性 的值void removeAttribute(Stringkey)/根据属性名将域中的属性移除2 JavaWeb 中的四个域page 域范围:当前页面对应的域对象:pageContext request 域范围:当前请求(一次请求) 对应的域对象:requestsession 域范围:当前会话对应的域对象:session applic
25、ation 域范围:当前 Web 应用程序对应的域对象注意:四个域对象的使用规则:能用小的就不用大的3 Servlet 与 jsp 页面的分工:Servlet 用来处理请求jsp 用来显示页面4 EL1 为什么要使用 ELjsp2.0 以后不建议使用 JSP片段和 JSP 表达式,建议使用 JSTL 代替片段,EL 代替 JSP 表达式2 简介全称:Expression Language 表达式语言格式:$表达式 EL 表达式主要用来将域对象中的属性输出到页面中EL 表达式默认是全域找先从 page 域中查找,找到后直接返回;如果找不到,从 request 域中找,还找不到,再从 sessio
26、n 域中找如果在 application 域中还找不到就直接返回空串3 能不能进行精确查找:EL 给我们提供是个 Scope 对象,用来在指定域中查找属性值,这四个Scope 对象相当于将域对象中的域单独拿了出来pageScope:用来获取 page 域中的属性值requestScope:用来获取 request 域中的属性值sessionScope:用来获取 session 域中的属性值applicationScope:用来获取 application 域中的属性值如果域中指定的属性名比较特殊,通过以下方式获取属性值:$requestScope'hello-kitty'4 用
27、 EL 表达式获取 JavaBean 中的属性值通过对象. 属性名的方式获取 JavaBean 的属性值, 这时调用的是JavaBean 类的 get方法如果获取的对象的属性还是一个对象,可以通过继续点的形式获取属性值,只要有对应的 get 方法就可以获取属性值5 EL 中的 11 个隐含对象1 pageContext:它既是 JSP 中的隐含对象又是 EL 中的隐含对象类型:PageContext作用:获取 JSP 中的其它隐含对象:如:request 对象获$pageContext.req取当前Web应用的虚拟路径:ontextPath2 四个 Scope 对象:pageScope:类型:
28、Map<String,Object>作用:获取 page 域中的属性值requestScope:类型:Map<String,Object>用来获取 request 域中的属性值sessionScope:类型:Map<String,Object>用来获取 session 域中的属性值applicationScope:类型:Map<String,Object>用来获取 application 域中的属性值3其它六个隐含对象:param类型:Map<String,String> 作用:获取请求参数paramValues类型:Map<S
29、tring,String>作用:获取请求参数中的一个键对应多个值的情况header类型:Map<String,String> 作用:获取请求头中的信息heaserValues类型:Map<String,String>作用:获取请求头中一个键对应多个值的情况cookie类型:Map<String,Cookie>作用:根据 Cookie 对象的名字获取 Cookie 对象initParam类型:Map<String,String>作用:获取当前 Web 应用的初始化参数6 EL 中的运算在 EL 表达式中可以直接进行加减乘除等运算empty 运
30、算符:我们通常使用 empty 运算符来判断一个字符串或者一个集合是否为空empty 和 null 的比较:相似:只有参数值为 null 的时候,返回值一样都是 true区别:1、空串:null 返回 false,empty 返回 true 2、空集合,null 返回 false,empty 返回 true5 JSTL1 JSTL 简介全称:JSP Standard Tag Library2库core: fn:函数库,c库,需要结合 EL 表达式使用,里面定义了一些对字符串的操作fmt:格式化库,里面定义了对日期、时间、数字的操作3库库需要导入两个 jar 包需要导入使用使用prefix=&q
31、uot;c"%>库: <% taglib uri=".core"1 set:向域中添加属性,默认添加到 page 域中var 属性:用来设置向域中添加属性时的属性名value 属性:用来设置向域中添加属性时的属性值scope 属性:用来设置将属性添加到哪个域中,可选:page、request、session、application2 remove:用来移除域中的属性var:指定要移除的属性的属性名scope 属性:用来设置将属性从哪个域中移除,可选:page、request、session、application3 iftest 属性:用来接收一个布尔
32、类型的值,为 true 时才执行体中的内容4 choose:相当于 Java 中的 if.else<c:choose><c:when<c:when<c:whentest=""></c:when> test=""></c:when>test=""></c:when><c:otherwise></c:otherwise></c:choose>when只要有一个满足要求,下面的就不再执行when 和 otherwise,不
33、能脱离 choose单独使用5 forEach:相当于 Java 中的 for 循环begin 属性:用来设置循环的开始,最小值是 0,不能小于 0 end 属性:用来设置循环的结束var 属性:用来设置一个变量来接收遍历到的值,同时会把接收到的值放到 page 域中,属性名就是指定的 var 的属性值<c:forEach begin="1" end="10" var="index"></c:forEach>6 会话控制1 为什么使用会话控制1 先来说说 Http 协议的特点纯文本无状态1、浏览器不知道多个请求
34、是否是来自同一个用户,但是我们有时候需要让浏览器知道多个请求来之同一个用户。例如:网上购物2、会话控制涉及到两种技术:Cookie 和 Session2 CookieCookie 是服务器给浏览器的用于区分不同用户的一段信息1 Cookie 的运行机制1、服务器创建 Cookie 对象。new Cookie(name,value);2、服务器将 Cookie 对象象);给浏览器。response.addCookie(cookie对3、以后浏览器再请求就会携带该 Cookie 对象4、服务器根据不同的 Cookie 对象来区分不同的用户2 创建 Cookie 对象【案例代码】/ 1.创建 Coo
35、kie 对象/Cookie 对象的名字必须使用英文;Cookie 的值可以使用中文,但是需要设置字符集进行编码,所以建议使用英文Cookie cookie = new Cookie("user1", "admin");/2.将 Cookie 对象给浏览器response.addCookie(cookie);3Cookie 对象【案例代码】/Cookie 对象Cookie cookies = request.getCookies(); if(cookies != null)/浏览器禁用 cookie,会为空/遍历数组得到每一个 Cookie 对象for(C
36、ookie cookie : cookies) /获取 Cookie 对象的名字Stringname=cookie.getName();/获取 Cookie 对象的值Stringvalue=cookie.getValue();System.out.println("Cookie对象的名字是:"+name);System.out.println("Cookie对象的值是:"+value);4 修改 Cookie 对象【案例代码】/修改 Cookie 对象/方式一:创建一个同名的 Cookie 对象/Cookie cookie = new Cookie(&q
37、uot;user1","sunwukong");/将修改之后的 Cookie 对象response.addCookie(cookie);给浏览器/方式二:直接修改 Cookie 对象的 value 值Cookie cookies = request.getCookies(); if(cookies != null)for (Cookie cookie : cookies) /获取 cookie 对的名字Stringname=cookie.getName();if("user1".equals(name)/修改该 Cookie 对象的值cooki
38、e.setValue("meihouwang");/ 将 修 改 之 后 的Cookie 对象给浏览器response.addCookie(cookie);5 持久化 Cookie【案例代码】/创建 Cookie 对象Cookie cookie = new Cookie("persist", "man");/设置 Cookie 对象的有效时间/* setMaxAge(int age)* age> 0 :在 age 秒后 Cookie 对象失效* age = 0 : Cookie 对象立即失效* age < 0 : 默认,C
39、ookie 对象是会话级别的*/cookie.setMaxAge(0);/将持久化的 Cookie 对象response.addCookie(cookie);给浏览器6 Cookie 对象的有效路径1、不是任何路径都会携带浏览器中保存的所有 Cookie 对象2、Cookie 对象的有效路径即哪些路径是会携带对象的 Cookie 对象3、Cookie 对象默认的有效路径是当前 Web 应用的根目录4、我们可以通过 setPath()方法来设置 Cookie 对象的有效路径【案例代码】/ 创建 Cookie 对象Cookie cookie = new Cookie("user3&quo
40、t;, "path");/设置该 Cookie 对象的有效路径/setPath()方法中的路径由浏览器cookie.setPath(request.getContextPath()+"/hello");/将 Cookie 对象给浏览器response.addCookie(cookie);7 Cookie 的用途推荐、免登录8 Cookie 对象的缺陷1、Cookie 是明文的,不安全2、不同的浏览器对 Cookie 对象的数量和大小有限制3、Cookie 对象携带过多费流量4、Cookie 对象中的 value 值只能是字符串,不能放对象网络中传递数据只
41、能是字符串3 SessionSession 即 HttpSession 对象,用来保存用户信息1 Session 的运行机制1、在服务器端创建 Session 对象,该对象有一个全球唯一的 ID2、在创建 Session 对象的同时创建一个特殊的 Cookie 对象,该 Cookie 对象的名字是 JSESSIONID,该 Cookie 对象的 value 值是 Session 对象的那个全球唯一的 ID,并且会将这个特殊的 Cookie 对象携带给浏览器3、以后浏览器再请求就会携带这个特殊的 Cookie 对象4、服务器根据这个特殊的 Cookie 对象的 value 值在服务器中寻找对应的
42、Session 对象,以此来区分不同的用户2 创建 Session 对象1、如果项目中有 JSP 页面,当你对象首页 index.jsp 时就会创建 Session2、一旦 Session 对象被创建,在整个会话中使用的就是该 Session 对象, 不管在哪儿获取,获取的都是该 Session 对象,也就是说在一次会话中只能使用一个 Session 对象3、如 果 项 目 中 只 有 HTML 页 面 , 整 个 时 候 在 Servlet 中通 request.getSession()来创建 Session 对象【案例代码】/获取 SessionHttpSession session =
43、request.getSession();/获取 Session 对象的 ID String id = session.getId(); System.out.println(id);/创建一个 Student 对象Student student = new Student(1, "孙悟空");/向 Session 对象中添加一个用户session.setAttribute("stu", student);3 通过持久化JSESSIONID 的Cookie 对象来找到对应的Session 对象1、由于 Cookie 对象的默认有效时间是一次会话,当我们关
44、闭浏览器之后, JSESSIONID 的 Cookie 对象就失效了,再次打开浏览器就不再携带 JSESSIONID 的 Cookie 对象,也就找不到与之对应的 Session 对象,所以 Session 对象中保存的用户也就找不到了2、我们可以通过持久化 JSESSIONID 的 Cookie Session 对象【案例代码】/获取所有的 Cookie 对象Cookie cookies = request.getCookies(); if(cookies != null)for (Cookie cookie : cookies) /获取 Cookie 对象的名字String name =
45、cookie.getName(); if("JSESSIONID".equals(name)/将该 Cookie 对象持久化cookie.setMaxAge(60);对象来找到之前创建的/将持久化之后的 Cookie 对象response.addCookie(cookie);给浏览器4 设置 Session 对象的最大空闲时间1、Session 对象的最大空间时间是 30 分钟,我们也可以设置 Session 对象的最大空闲时间5 钝化和活化1、Session 与 session 域中的对象一起从内存中被序列化到硬盘上的过程我们称为钝化。服务器关闭时会发生钝化。2、Sess
46、ion 与 session 域中的对象一起从硬盘上反序列化到内存中的过程我们称为活化。服务器再次开启时会发生活化。3、要保证 session 域中的对象能和 Session 一起被钝化和活化,必须保证对象对应的类实现 Serializable 接口6 URL 重写如果浏览器禁用了 Cookie,每次请求将不再携带 Cookie 对象,也就无法获取与之对应的 Session 对象,就导致无法获取 session 域中保存的用户,这时就需要进行 URL 重写【案例代码】<h1>URL 重写</h1><%session.setAttribute("stu&qu
47、ot;, "美猴王");/URL 重写方式一:Stringurl=response.encodeURL(request.getContextPath()+"/show.jsp");/获取 Session 对象HttpSession session = request.getSession();/这 Session 对象的最大空闲时间/* setMaxInactiveInterval(int age)* age > 0 : Session 对象在 age 秒后失效* age = 0 : Session 对象立即失效* age < 0 : Ses
48、sion 对象永远不失效*/session.setMaxInactiveInterval(0);/我们通常使用以下方式使 Session 对象立即失效Stringurl2=response.encodeRedirectURL(request.getContextPath()+"/show.jsp");%><%=url %><br><br><!- URL 重写方式二:使用 c中的 url-><c:url value="/show.jsp"></c:url><br>&l
49、t;br><a href="<%=url2 %>">你是请来的猴子吗?</a><br><br><a href="<%=url %>">猴子你快出来</a>7 表单的重复提交问题同一个表单,同样的数据向服务器提交多次,即为表单的重复提交表单重复提交的危害:1、增加服务器的2、数据库中会保存很多表单重复提交有一下三种情况:数据1、在使用转发的情况下:表单重复提交之后反复刷新成功页面产生的原因:在转发的情况下由于地址栏无变化,与 form 表单中的action
50、 属性值一致,这时候刷新页面相当于再次向 action 属性值中的地址请求,就相当于重复提交表单。解决方案:使用重定向2、在网速很慢的情况下,多次点击提交按钮产生原因:提交按钮可以被点击多次解决方案:提交按钮只让单击一次3、表单提交成功后,点击后退的按钮,再不刷新页面的情况下再次点击表单的提交按钮产生原因:服务器可以处理重复提交的请求解决方案:使用 token(记使用 token 步骤:牌)(1) 使用 UUID 生成一个全球唯一的字符串作为 token,同时将token 放到 session 域中(2) 将 UUID 生成的 token 放到表单中的一个隐藏域中,就会随着用户提交的表单,一同
51、提交到服务器(3) 在服务器端获取用户提交表单时提交的 token,然后再获取session 域中保存的 token,将两个进行比较。相等则正常处理;不相等则重复提交表单(4)正常处理请求后,需要将 session 域中的 token 移除4步骤:1 导入 jar 包:kaptcha-2.3.2.jar2 在 web.xml 中【代码】的 Servlet:<!-生成的 Servlet -><servlet><servlet-name>KaptChaServlet</servlet-name><servlet-class>com.t-c
52、lass>.code.kaptcha.servlet.KaptchaServlet</servle<!- 配置<init-param>的边框 -><param-name>kaptcha.border</param-name><param-value>no</param-value></init-param><!- 设置<init-param>中的字符 -><param-name>kaptcha.textproducer.char.string</param-
53、name><param-value>Il1</param-value></init-param><!- 设置<init-param>在 session 域中保存的 key -><param-name>kaptcha.session.key</param-name><param-value>code</param-value></init-param></servlet><!-Servlet -><servlet-mapping><
54、;servlet-name>KaptChaServlet</servlet-name><url-pattern>/code.jpg</url-pattern></servlet-mapping>3 给图片绑定单击,每次单击就会刷新4 在服务器端获取用户输入的请求,再获取 session 对象中保存的key。二者进行比较,相等则验证通过;不相等则验证不通过。5 如果验证相等,则设置 session 中保存的key 失效。保证验证码只能验证一次,解决了重复提交的问题。【案例代码见后】/获取用户输入的String reqCode = reques
55、t.getParameter("reqCode");/获取服务器生成的HttpSession session = request.getSession();String code = (String) session.getAttribute("code");/验证是否正确正确if(code.equals(reqCode)/移除 session 中的session.removeAttribute("code");else不正确/设置一个错误消息,放入 request 域中/给图片绑定单击$("#codeImg").
56、click(function()$(this).attr("src","code.jpg?t="+Math.random(););输入错误!");request.setAttribute("msg", "/转发到页面request.getRequestDispatcher("/pages/user/regist.jsp").forward(request, response);7 Filter1 Filter 简介Filter,即过滤器,用于过滤请求,服务器端的三大组件之一服务器端的三大组件:S
57、ervlet、Filter、Listener服务器端三大组件的特点: 都需要运行在服务器端都需要实现某个接口都需要在 web.xml 中【代码】<!-<filter>Filter -><filter-name>HelloFilter</filter-name><filter-class>com.atguigu.filter.HelloFilter</filter-class></filter><!-Filter -><filter-mapping><filter-name>HelloFilter</filter-name><url-pattern>/index.jsp</url-pattern></filter-mapping> Filter 的作用:1、在请求到达 Web2、放行请求之前请求3、在响应到达浏览器之前做一些操作2 Filter 的生命周期1Filter 的生命周期是 Filter 对象2Filter 的生命周期主要体现在以下方法中:构造器:服务器一启动就被调用,说明一启动就创建 Filter 对象在整个生命周期过程中只被调用一次,说明 Filter 也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全国自考(金融法)模拟试卷14
- 初中语文七年级下第三单元《走近“小人物”》作业设计
- 人美版七年级美术《艺术节策划与美术设计》作业设计
- 2026 学龄前自闭症融合干预语言课件
- 江苏省苏州市太仓达标名校2026届中考试题猜想英语试卷含答案
- 内蒙古师范大学锦山某中学高三压轴卷新高考化学试卷及答案解析
- 2026 学龄前自闭症童谣诵读训练课件
- 智能设备对家庭生活的影响研究
- 2026 学龄前自闭症情绪适配调整课件
- 2026 学龄前自闭症家校实操课件
- DL∕T 531-2016 电站高温高压截止阀闸阀技术条件
- 智能制造概论
- 单元写作任务 统编版高中语文必修下册
- 个人查摆问题清单和整改措施
- 架空配电线路及设备运行规程
- GB/T 2484-2023固结磨具形状类型、标记和标志
- 苏泊尔电磁炉标准板电路分析
- 五行称命书--源自唐朝手抄本(檀香四逸)
- 失血性休克的诊治麻醉病例讨论
- 制冷机组与空调水系统
- FZ/T 54131-2021弹性涤纶牵伸丝/涤纶预取向丝空气变形丝(EDY/POY ATY)
评论
0/150
提交评论