Servlet

一、简介

Servlet (server applet) 是运行服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口

请求响应与HttpServletRequest和HttpServletResponse之间的对应关系:

在这里插入图片描述

二、开发流程

  1. 参照上一篇内容创建一个web类型module
  2. 新建一个Servlet类,继承HttpServlet,重写servicedoMeth方法doGet、doPost等方法
  3. web.xml自定义的Servlet配置请求的映射路径配置 servletservlet-mapping

步骤2

public class UserServlet extends HttpServlet {

	@Override
	public 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 version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>
</web-app>

三、生命周期

Servlet对象是Servlet容器创建的,生命周期方法都是由容器(目前我们使用的是Tomcat)调用的。这一点和我们之前所编写代码有很大不同。在今后的学习我们会看到,越来越多的对象交给容器框架来创建,越来越多的方法容器框架调用开发人员要尽可能多的将精力放在业务逻辑实现上。

生命周期 对应方法 执行时机 执行次数
构造对象 构造器 第一次请求或者容器启动 1
初始化 init() 构造完毕后 1
处理服务 service(HttpServletRequest req,HttpServletResponse resp) 每次请求 多次
销毁 destory() 容器关闭 1

load-on-startup :当值为0或者大于0时,代表容器启动加载该servlet。正数的值越小,启动加载该servlet的优先级越高。如果为负数,则容器启动时不会加载该servlet,只有该servlet被选择时才会加载

四、ServletConfig和ServletContext

ServletConfig:ServletConfig为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象。容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性。可通过该对象迭代获取servlet初始化配置参数

方法 作用
getServletName() 获取<servlet-name>HelloServlet</servlet-name>定义的Servlet名称
getServletContext() 获取ServletContext对象
getInitParameter() 获取配置Servlet时设置的『初始化参数』,根据名字获取值
getInitParameterNames() 获取所有初始化参数名组成的Enumeration对象

ServletContext:ServletContext对象有称呼为上下文对象,或者叫应用域对象容器会为每个app创建一个独立的唯一的ServletContext对象。通过该对象可获取静态资源的真实路径以及项目的上下文路径

域对象:一些用于存储数据和传递数据的对象,传递数据不同的范围为不同的域。

API 功能解释
void setAttribute(String key,Object value); 向域中存储/修改数据
Object getAttribute(String key); 获得域中的数据
void removeAttribute(String key); 移除域中的数据

五、HttpServletRequest常见API

API 功能解释
StringBuffer getRequestURL(); 获取客户端请求的url
String getRequestURI(); 获取客户端请求项目中的具体资源
int getServerPort(); 获取客户端发送请求时的端口
int getLocalPort(); 获取本应用在所在容器的端口
int getRemotePort(); 获取客户端程序端口
String getScheme(); 获取请求协议
String getProtocol(); 获取请求协议版本号
String getMethod(); 获取请求方式
API 功能解释
String getHeader(String headerName); 根据头名称获取请求头
Enumeration getHeaderNames(); 获取所有的请求头名字
String getContentType(); 获取contenttype请求头
  • 获得请求参数相关
API 功能解释
String getParameter(String parameterName); 根据请求参数名获取请求单个参数值
String[] getParameterValues(String parameterName); 根据请求参数名获取请求多个参数值数组
Enumeration getParameterNames(); 获取所有请求参数名
Map<String, String[]> getParameterMap(); 获取所有请求参数的键值集合
BufferedReader getReader() throws IOException; 获取读取请求体的字符输入
ServletInputStream getInputStream() throws IOException; 获取读取请求体的字节输入流
int getContentLength(); 获得请求体长度的字节
  • 其他API
API 功能解释
String getServletPath(); 获取请求的Servlet的映射路径
ServletContext getServletContext(); 获取ServletContext对象
Cookie[] getCookies(); 获取请求中的所有cookie
HttpSession getSession(); 获取Session对象
void setCharacterEncoding(String encoding) ; 设置请求体字符

六、HttpServletResponse常见API

API 功能解释
void setStatus(int code); 设置响应状态
API 功能解释
void setHeader(String headerName, String headerValue); 设置/修改响应头键值
void setContentType(String contentType); 设置contenttype响应头及响应字符集(设置MIME类型)
  • 设置响应体相关
API 功能解释
PrintWriter getWriter() throws IOException; 获得向响应体放入信息字符输出
ServletOutputStream getOutputStream() throws IOException; 获得向响应体放入信息字节输出
void setContentLength(int length); 设置响应体的字节长度,其实就是在设置contentlength响应头
  • 其他API
API 功能解释
void sendError(int code, String message) throws IOException; 客户端响应错误信息方法,需要指定响应码和响应信息
void addCookie(Cookie cookie); 向响应体中增加cookie
void setCharacterEncoding(String encoding); 设置响应体字符

七、请求转发和响应重定向

7.1 概述

7.2 请求转发

在这里插入图片描述

  • 请求转发通过HttpServletRequest对象获取请求转发器实现
  • 请求转发是服务器内部行为,对客户端是屏蔽的
  • 客户端只发送了一次请求,客户地址栏不变
  • 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源
  • 因为全程只有一个HttpServletRequset对象,所以请求参数可以传递,请求域中的数据也可以传递
  • 请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转
  • 请求转发可以转发给WEB-INF下受保护的资源
  • 请求转发不能转发到本项目以外的外部资源
@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  获取请求转发器
        //  转发给servlet  ok
        RequestDispatcher  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 {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  获取请求参数
        String username = req.getParameter("username");
        System.out.println(username);
        //  向请求域中添加数据
        req.setAttribute("reqKey","requestMessage");
        //  响应重定向
        // 重定向到servlet动态资源 OK
        resp.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请求乱码

解决方案:

8.2 响应乱码问题

  • 在Tomcat10.1.7中,向响应体中放入的数据默认使用了工程编码 UTF-8
  • 浏览器在接收响应信息时,使用了不同的字符集或者是不支持中文的字符集就会出现乱码

解决方案:

// 告诉浏览器以指定的MIME类型和字符集解析响应体
resp.setContentType("text/html;charset=UTF-8")

MIME类型

  • MIME类型,可以理解为文档类型,用户表示传递的数据是属于什么类型的文档
  • 浏览器可以根据MIME类型决定该用什么样的方式解析接收到的响应体数据
  • 可以这样理解: 前后端交互数据时,告诉对方发给对方的是 html/css/js/图片/声音/视频/… …
  • tomcat/conf/web.xml中配置了常见文件的拓展名和MIMIE类型的对应关系
  • 常见的MIME类型举例如下
文件拓展名 MIME类型
.html text/html
.css text/css
.js application/javascript
.png /.jpeg/.jpg/… … image/jpeg
.mp3/.mpe/.mpeg/ … … audio/mpeg
.mp4 video/mp4
.m1v/.m1v/.m2v/.mpe/… … video/mpeg

九、MVC架构模式

MVC(Model View Controller)是软件工程中的一种 软件架构模式,它把软件系统分为 模型视图控制器 三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面用户交互的同时,不需要重新编写业务逻辑

MVC模式下,项目中的常见包

非前后端分离的MVC

在这里插入图片描述

前后端分离的MVC

在这里插入图片描述

原文地址:https://blog.csdn.net/xxx1276063856/article/details/134630159

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_4875.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注