Servlet、request、response 谁践踏了优雅 2022-04-24 10:24 194阅读 0赞 Servlet: servler就是一个运行在Web服务器上的一个小的程序,用来接收和响应从客户端发送过来的请求,通常使用http协议 servlet 是sun公司提供的一个动态的网页开发技术 servlet 的作用 用来处理从客户端浏览器发送的请求,并且可以对请求发送响应 在使用servlet 时,需要编写一个类实现 Servlet 的接口,将编写的这个类配置到服务器中 public class ServletDemo1 implements Servlet{ @Override /** * 为用户处理请求和响应的方法. */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.getWriter().println("Hello Servlet..."); } ... } 配置servlet文件在web.xml中进行配置 ,当浏览器访问指定路径时,会执行servlet <!-- 配置Servlet --> <servlet> <!-- Servlet的名称 --> <servlet-name>test1③</servlet-name> <!-- SErvlet的全路径 --> <servlet-class>com.itheima.a_servlet.ServletDemo1④</servlet-class> </servlet> <!-- Servlet的映射 --> <servlet-mapping> <!-- Servlet的名称 --> <servlet-name>test1②</servlet-name> <!-- Servlet的访问路径 --> <url-pattern>/ServletDemo1①</url-pattern> </servlet-mapping> 其中有一些方法可以 获取请求的路径,参数,数据 getMethod():获取请求方式 是get还是post方式 String getParameter(String name) :用于接受一个名称对应一个值的数据 String\[\] getParameterValues(String name):用于接受一个名称对应多个值的数据 Map getParameterMap();用于接受表单中的所有的数据,Map集合的key是表单提交的参数名称,Map的value是提交参数的值(该值可能是一个数组,所有在接受的时候Map泛型的值是一个数组) 小知识点; 如果当前项目使用的是tomcat 容器,在页面表单提交数据时,其实数据默认提交到tomcat 的webapps的路径下的项目中 原因是:在将项目配置到tomcat 上的时候,tomcat会将项目拷贝到webapps路径下,在方法访问的时,开始的/ 表示的是webapps目录 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5Nzg3OQ_size_16_color_FFFFFF_t_70][] Servlet访问的流程: 1,客户端浏览器发送请求 2,服务器接收请求后,查找web.xml 中是否存在对应的访问地址 3,根据映射路径找到对应的Servlet处理类 4,调用servlet 方法 5,通过ServletRequest 获取页面传递过来的参数 6,通过ServletResponse 向浏览器输出内容 7,浏览器接收内容后进行显示 在web开发中,通常继承HttpServlet 类 Servlet 的生命周期,所以的周期就是一个对象从创建到销毁的过程 当用户第一次访问Servlet的时候,就会创建Servlet 的实例(访问其构造方法) 然后init方法执行 任何一次的请求都糊去创建一个新的线程,访问servlet中的service 方法 在Servie方法内部 会根据请求的方式进行不同的调用,doget还是dopost方法 当服务器关闭或者项目从服务器中移除,Servlet就会被销毁,destroy()方法就会执行 Servlet 的相关配置 <load-on-startup> 用于表示优先级,如果设置,该Servlet 在程序启动是就会调用init方法,数字越小优先级越高,但是1不能使用,是Servlet默认的,所以在使用的时候从2开始使用 Response 进行响应到浏览器端 设置响应头配置 addHeander(String name,String value) 将给定的名字和数值添加到响应头部 如果由多个value 则是在后面继续添加 addDateHeader(String name,long date) 将给定的名字和日期添加到响应的头部, addIntHeader(String name,int value) 将给定的名字和整数值添加到响应的头部 setHeader (String name,String value ) 针对一个key 有一个value指的,将在原有的值上进行修改,而不是在后面继添加 setHeader(String name,String value) setDateHeader(String name,long date) setIntheader(String name,int value) 页面刷新 Response.setHeader("refresh" ,"5;url=' ' ") 重定向 ,跟状态码配合使用 302 Response.Status(302) 设置状态码 Response.setHeader('location"," /Demo/index.html ") 在html 中进行页面的跳转 在html 中进行页面的跳转 在html中进行网页的跳转 <head><meta charset="UTF-8"> <meta http-equiv="Refresh" content="5;url='/Demo01\_Servlet/Count'" > <title>Insert title here</title> 响应体:使用文件流读,用下面的方法进行写出 ,这两种方法 不能同时使用,一个是字符流一个是字节流 getOutputStream() getWriter() 解决响页面输出中文乱码的问题 设置浏览器默认的打开编码格式(post) **response.setContentType(“text/html;charsert=utf-8”)** **text/html;charsert=utf-8****中的****utf-8****不需要加引号,会报错** **get解决方案(有三种,说最常用的一种)** ** 使用String 的构造方法 --- 推荐使用** **根据不同浏览器解决乱码问题** ** ** // 根据浏览器的类型处理中文文件的乱码问题: String agent = request.getHeader("User-Agent"); System.out.println(agent); if(agent.contains("Firefox")){ filename = base64EncodeFileName(filename); }else{ filename = URLEncoder.encode(filename,"UTF-8"); } public static String base64EncodeFileName(String fileName) { BASE64Encoder base64Encoder = new BASE64Encoder(); try { return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF-8"))) + "?="; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } } **ServletContext对象(域对象) 作用于整个Web项目** **所以在this.getServletContext() 的时候,其实路径就到了当前的项目下了** **什么是域对象,** ** 域对象 就是在其内部维护了一个Map<String .object>** ** 域对象可以用来存储数据** ** 每个域对象都有自己的作用范围** **ServletContext 对象的特点** ** ServletConetext 对象是一个域对象** ,最用范围是整个web的应用 每个wen项目都有一个唯一的ServletContext 对象 在web应用被服务器加载的时候就会创建该对象,当服务器关闭,或者服务器中的项目移除的时候,就会销毁该对象 servletContext对象的获取 通过ServletConfig对象获取,或者在继承httpServlet之后,使用this.getServetContext 进行获取 ServletConetext对象常用的方法 1. setAttribute(String name ,object object);用于保存数据 2. getAttribute(String name);获取数据 3. removeAttribute(String name);删除数据 4. getInitParameter(String anme); 获得全局的参数 5. getRealPath(String name); 为给定虚拟路径返回包含实际路径的 String 6. getMimeType(String file) 返回指定文件的 MIME 类型,如果 MIME 类型未知,则返回 null, 常见 MIME 类型是 "text/html" 和 "image/gif" ServletContext对象的作用域 1,用来获取 全局的初始化参数 例: 例:在web.xml的根元素下配置一下信息: <context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </context-param> 这些参数就属于整个应用的全局参数,使用ServletContext来读取。 this.getServletContext().getInitParameter("name"); 2,用来获取文件的mime类型 参数值是文件的路径 this.getServletContext.getMimeType("/dome.html") 3,作为域对象存取数据 this.getServletContext().setAttribute("count", 0); setAttribute:设置初始值,在init中进行初始化 this.getServletContext().getAttribute("count"); getAttribute:获取里面的count键的值 常用的方法: 1. **S****tring getServletName();****获得****Servlet在web.xml中配置的name的值.** 2. **getServletContext();** **获取****ServletContext****对象** 3. **getInitParameter(String name);****获得servlet初始化数据** 1、在web.xml中增加如下配置 <servlet> <servlet-name> ServletDemo7 </servlet-name> <servlet-class> com.itheima.a\_servlet.ServletDemo7 </servlet-class> <!-- 配置初始化参数 --> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServletDemo7</servlet-name> <url-pattern>/ServletDemo7</url-pattern> </servlet-mapping> 注意:只在当前servlet中有效 getInitParameterNames();获得所有Servlet的初始化参数的名称 **可以获取的servlet配置文件中的信息的原理** 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息 Request和Response 的不同 HTTP 请求部分 请求行,请求方式,请求路径,协议版本 请求方式,POST 和 get 请求方式很多,但是最常用的就是get和post 区别: get有大小限制,参数在地址栏中显示 post 没有大小限制,参数存放在参数体中 请求路径要访问那个路径中的内容 协议版本,使用 版本 1.1 1.0 :连接一次 就会断开连接 1.1: 连接一次不会接着断开,而是过一段时间之后么有请求的时候会断开 请求头,键值对的存在 Referrer : 网页的来源,用于防盗链 User-Agent 浏览器的类型和一些基本的额信息 if-modified-Since 跟响应头的Last-modifide一起使用,用于查询本地的缓存 请求体:post 的提交参数在请求体中,get提交的参数在地址啦中 Request 作为域对象存储数据 Request 的作用范围 作用的返回是一次请求 创建:客户端想服务器发送一次请求之后,服务器就会创建一个Request 对象 销毁 : 当服务器对这次请求做出了响应之后,就会被销毁 重定向和转发的区别:(redirect和forward) 重定向的地址会发生改变,转发的地址不会发生改变 重定向需要两次请求和两次响应,转发一次,请求一次 重定向可以访问任意网站,转发只能访问服务器内自己的网站 重定向需要加工程名,而转发不需要加工程名(自己访问自己) [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5Nzg3OQ_size_16_color_FFFFFF_t_70]: /images/20220216/4471d3a940c640a69908647c88252f05.png
还没有评论,来说两句吧...