网站从建设到运营管理的理解,朝阳网站建设是什么,重庆网站建设公司哪家好,网站对不同分辨率Servlet 文章目录 Servlet一、简介二、开发流程三、生命周期四、ServletConfig和ServletContext五、HttpServletRequest常见API六、HttpServletResponse常见API七、请求转发和响应重定向7.1 概述7.2 请求转发7.3 响应重定向 八、请求与响应乱码问题8.1 GET与POST请求乱码8.2 响…Servlet 文章目录 Servlet一、简介二、开发流程三、生命周期四、ServletConfig和ServletContext五、HttpServletRequest常见API六、HttpServletResponse常见API七、请求转发和响应重定向7.1 概述7.2 请求转发7.3 响应重定向 八、请求与响应乱码问题8.1 GET与POST请求乱码8.2 响应乱码问题 九、MVC架构模式 一、简介
Servlet (server applet) 是运行在服务端(tomcat)的Java小程序是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口
用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的控制器不是所有的JAVA类都能用于处理客户端请求能处理客户端请求并做出响应的一套技术标准就是ServletServlet是运行在服务端的所以 Servlet必须在WEB项目中开发且在Tomcat这样的服务容器中运行
请求响应与HttpServletRequest和HttpServletResponse之间的对应关系 二、开发流程
参照上一篇内容创建一个web类型的module新建一个Servlet类继承HttpServlet重写service或doMeth方法doGet、doPost等方法 Servlet对象的生命周期(创建初始化处理服务销毁)是由tomcat管理的无需我们自己newHttpServletRequest 代表请求对象是由请求报文经过tomcat转换而来的通过该对象可以获取请求中的信息HttpServletResponse 代表响应对象该对象会被tomcat转换为响应的报文通过该对象可以设置响应中的信息 在 web.xml 为自定义的Servlet配置请求的映射路径配置 servlet 和 servlet-mapping
步骤2
public class UserServlet extends HttpServlet {Overridepublic void service(ServletRequest request, ServletResponse response) throws IOException {String username request.getParameter(username);if (username ! null !username.isEmpty()) {response.getWriter().println(参数获取成功 username);} else {response.getWriter().println(参数获取失败);}}
}步骤3
?xml version1.0 encodingUTF-8?
web-app xmlnshttps://jakarta.ee/xml/ns/jakartaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttps://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsdversion6.0servletservlet-nameuserServlet/servlet-nameservlet-classservlet.UserServlet/servlet-class/servletservlet-mappingservlet-nameuserServlet/servlet-nameurl-pattern/userServlet/url-pattern/servlet-mapping
/web-app三、生命周期
Servlet对象是Servlet容器创建的生命周期方法都是由容器(目前我们使用的是Tomcat)调用的。这一点和我们之前所编写的代码有很大不同。在今后的学习中我们会看到越来越多的对象交给容器或框架来创建越来越多的方法由容器或框架来调用开发人员要尽可能多的将精力放在业务逻辑的实现上。
生命周期对应方法执行时机执行次数构造对象构造器第一次请求或者容器启动1初始化init()构造完毕后1处理服务service(HttpServletRequest req,HttpServletResponse resp)每次请求多次销毁destory()容器关闭1
Servlet对象在容器中是单例的容器是可以处理并发的用户请求的每个请求在容器中都会开启一个线程
load-on-startup 当值为0或者大于0时代表容器启动时加载该servlet。正数的值越小启动时加载该servlet的优先级越高。如果为负数则容器启动时不会加载该servlet只有该servlet被选择时才会加载。 如果数字重复了容器会自行解决实例化顺序问题但是应该避免重复 Tomcat容器中已经定义了一些随系统启动实例化的servlet我们自定义的servlet的load-on-startup尽量不要占用数字1-5
四、ServletConfig和ServletContext
ServletConfigServletConfig为Servlet提供初始配置参数的一种对象每个Servlet都有自己独立唯一的ServletConfig对象。容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性。可通过该对象迭代获取servlet初始化配置参数。
方法名作用getServletName()获取servlet-nameHelloServlet/servlet-name定义的Servlet名称getServletContext()获取ServletContext对象getInitParameter()获取配置Servlet时设置的『初始化参数』根据名字获取值getInitParameterNames()获取所有初始化参数名组成的Enumeration对象
ServletContextServletContext对象有称呼为上下文对象或者叫应用域对象。容器会为每个app创建一个独立的唯一的ServletContext对象。通过该对象可获取静态资源的真实路径以及项目的上下文路径
域对象一些用于存储数据和传递数据的对象传递数据不同的范围为不同的域。
ServletContext代表应用所以ServletContext域也叫作应用域是webapp中最大的域可以在应用内实现数据的共享和传递webapp中的三大域对象分别是应用域会话域请求域三大域对象都具有的API如下
API功能解释void setAttribute(String key,Object value);向域中存储/修改数据Object getAttribute(String key);获得域中的数据void removeAttribute(String key);移除域中的数据
五、HttpServletRequest常见API
获取请求行信息相关(方式请求的url协议及版本)
API功能解释StringBuffer getRequestURL();获取客户端请求的urlString getRequestURI();获取客户端请求项目中的具体资源int getServerPort();获取客户端发送请求时的端口int getLocalPort();获取本应用在所在容器的端口int getRemotePort();获取客户端程序的端口String getScheme();获取请求协议String getProtocol();获取请求协议及版本号String getMethod();获取请求方式
获得请求头信息相关
API功能解释String getHeader(String headerName);根据头名称获取请求头Enumeration getHeaderNames();获取所有的请求头名字String getContentType();获取content-type请求头
获得请求参数相关
API功能解释String getParameter(String parameterName);根据请求参数名获取请求单个参数值String[] getParameterValues(String parameterName);根据请求参数名获取请求多个参数值数组Enumeration getParameterNames();获取所有请求参数名MapString, String[] getParameterMap();获取所有请求参数的键值对集合BufferedReader getReader() throws IOException;获取读取请求体的字符输入流ServletInputStream getInputStream() throws IOException;获取读取请求体的字节输入流int getContentLength();获得请求体长度的字节数
其他API
API功能解释String getServletPath();获取请求的Servlet的映射路径ServletContext getServletContext();获取ServletContext对象Cookie[] getCookies();获取请求中的所有cookieHttpSession getSession();获取Session对象void setCharacterEncoding(String encoding) ;设置请求体字符集
六、HttpServletResponse常见API
设置响应行相关
API功能解释void setStatus(int code);设置响应状态码
设置响应头相关
API功能解释void setHeader(String headerName, String headerValue);设置/修改响应头键值对void setContentType(String contentType);设置content-type响应头及响应字符集(设置MIME类型)
设置响应体相关
API功能解释PrintWriter getWriter() throws IOException;获得向响应体放入信息的字符输出流ServletOutputStream getOutputStream() throws IOException;获得向响应体放入信息的字节输出流void setContentLength(int length);设置响应体的字节长度,其实就是在设置content-length响应头
其他API
API功能解释void sendError(int code, String message) throws IOException;向客户端响应错误信息的方法,需要指定响应码和响应信息void addCookie(Cookie cookie);向响应体中增加cookievoid setCharacterEncoding(String encoding);设置响应体字符集
七、请求转发和响应重定向
7.1 概述
请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段请求转发通过HttpServletRequest实现响应重定向通过HttpServletResponse实现
7.2 请求转发 请求转发通过HttpServletRequest对象获取请求转发器实现请求转发是服务器内部的行为,对客户端是屏蔽的客户端只发送了一次请求,客户端地址栏不变服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源因为全程只有一个HttpServletRequset对象所以请求参数可以传递请求域中的数据也可以传递请求转发可以转发给其他Servlet动态资源也可以转发给一些静态资源以实现页面跳转请求转发可以转发给WEB-INF下受保护的资源请求转发不能转发到本项目以外的外部资源
WebServlet(/servletA)
public class ServletA extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求转发器// 转发给servlet okRequestDispatcher requestDispatcher req.getRequestDispatcher(servletB);// 转发给一个视图资源 ok//RequestDispatcher requestDispatcher req.getRequestDispatcher(welcome.html);// 转发给WEB-INF下的资源 ok//RequestDispatcher requestDispatcher req.getRequestDispatcher(WEB-INF/views/view1.html);// 转发给外部资源 no//RequestDispatcher requestDispatcher req.getRequestDispatcher(http://www.baidu.com);// 获取请求参数String username req.getParameter(username);System.out.println(username);// 向请求域中添加数据req.setAttribute(reqKey,requestMessage);// 做出转发动作requestDispatcher.forward(req,resp);}
}7.3 响应重定向 响应重定向通过HttpServletResponse对象的sendRedirect方法实现响应重定向是服务端通过302响应码和路径告诉客户端自己去找其他资源是在服务端提示下的客户端的行为客户端至少发送了两次请求客户端地址栏是要变化的服务端产生了多对请求和响应对象且请求和响应对象不会传递给下一个资源因为全程产生了多个HttpServletRequset对象所以请求参数不可以传递请求域中的数据也不可以传递重定向可以是其他Servlet动态资源也可以是一些静态资源以实现页面跳转重定向不可以到给WEB-INF下受保护的资源重定向可以到本项目以外的外部资源
WebServlet(/servletA)
public class ServletA extends HttpServlet {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username req.getParameter(username);System.out.println(username);// 向请求域中添加数据req.setAttribute(reqKey,requestMessage);// 响应重定向// 重定向到servlet动态资源 OKresp.sendRedirect(servletB);// 重定向到视图静态资源 OK//resp.sendRedirect(welcome.html);// 重定向到WEB-INF下的资源 NO//resp.sendRedirect(WEB-INF/views/view1);// 重定向到外部资源//resp.sendRedirect(http://www.baidu.com);}
}八、请求与响应乱码问题
8.1 GET与POST请求乱码
HTML中的 meta charset字符集/ 影响了GET和POST方式提交参数的编码tomcat 10.1 的URI编码默认为 UTF-8
解决方案
方式1修改meta charset字符集/编码和 Tomcat10.1 的URI默认解析编码一致即可 (推荐)GET请求方式2修改 Tomcat10.1 的URI解析字符集。修改conf/server.xml中 Connecter 添加 URIEncoding“GBK” (不推荐)POST请求方式2修改请求解析体使用的字符集与前端保持一致调用 req.setCharacterEncoding 方法 (不推荐)
8.2 响应乱码问题
在Tomcat10.1.7中向响应体中放入的数据默认使用了工程编码 UTF-8浏览器在接收响应信息时,使用了不同的字符集或者是不支持中文的字符集就会出现乱码
解决方案
方式一客户手动设定浏览器对本次响应体解析时使用的字符集(不推荐)方式二后端通过设置响应体的字符集和浏览器解析响应体的默认字符集一致调用 resp.setCharacterEncoding 方法(不推荐)方式三通过设置content-type响应头告诉浏览器以指定的字符集解析响应体(推荐)
// 告诉浏览器以指定的MIME类型和字符集解析响应体
resp.setContentType(text/html;charsetUTF-8)MIME类型 MIME类型,可以理解为文档类型,用户表示传递的数据是属于什么类型的文档浏览器可以根据MIME类型决定该用什么样的方式解析接收到的响应体数据可以这样理解: 前后端交互数据时,告诉对方发给对方的是 html/css/js/图片/声音/视频/… …tomcat/conf/web.xml中配置了常见文件的拓展名和MIMIE类型的对应关系常见的MIME类型举例如下
文件拓展名MIME类型.htmltext/html.csstext/css.jsapplication/javascript.png /.jpeg/.jpg/… …image/jpeg.mp3/.mpe/.mpeg/ … …audio/mpeg.mp4video/mp4.m1v/.m1v/.m2v/.mpe/… …video/mpeg
九、MVC架构模式
MVCModel View Controller是软件工程中的一种 软件架构模式它把软件系统分为 模型、视图 和 控制器 三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码将业务逻辑聚集到一个部件里面在改进和个性化定制界面及用户交互的同时不需要重新编写业务逻辑。
MModel 模型层具体功能如下 存放和数据库对象的实体类以及一些用于存储非数据库表完整相关的VO对象存放一些对数据进行逻辑运算操作的的一些业务处理代码 VView 视图层具体功能如下 存放一些视图文件相关的代码 html css js等在前后端分离的项目中后端已经没有视图文件该层次已经衍化成独立的前端项目 CController 控制层具体功能如下 接收客户端请求获得请求数据将准备好的数据响应给客户端
MVC模式下,项目中的常见包 M 实体类包(pojo /entity /bean) 专门存放和数据库对应的实体类和一些VO对象数据库访问包(dao/mapper) 专门存放对数据库不同表格CURD方法封装的一些类服务包(service) 专门存放对数据进行业务逻辑运算的一些类 C 控制层包(controller) V web目录下的视图资源 html css js img 等前端工程化后,在后端项目中已经不存在了
非前后端分离的MVC 前后端分离的MVC