一 Servlet技术
什么是Servlet
- Servlet是JavaEE规范之一。规范就是接口
- Servlet时JavaWeb三大组件之一。三大组件为:Servlet程序、Filter过滤器、Listener监听器
- Servlet是运行在服务器上的一个java小程序,它可以接受客户端发过来的请求,并响应数据给客户端
手动实现Servlet程序
Web项目搭建
- 新建项目—新建模块

- file—project structure—facet—添加web
- file—project structure—artifact—添加archive

- web—WEB-INF—创建lib文件夹—将需要的jar包复制到里面(若lib包在module外面,则需要手动引入,project setting里会有提示fix)
- 配置tomcat 修改application context 对应的url也会改变
获取参数
<!DOCTYPE html><br /><html lang="en"><br /><head><br /> <meta charset="UTF-8"><br /> <title>Title</title><br /></head><br /><body><br /> <form action="add" method="post"><br /> 名称:<input type="text" name="fname"/></br><br /> 价格:<input type="text" name="price"/></br><br /> 库存:<input type="text" name="fcount"/></br><br /> 备注:<input type="text" name="remark"/></br><br /> <input type="submit" value="添加"/><br /> </form><br /></body><br /></html>
配置servlet类
在xml中配置servlet类
`<?xml version=”1.0” encoding=”UTF-8”?>
xsi:schemaLocation=”http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd“
version=”4.0”>
<!--配置servlet类的映射--><br /> <servlet-mapping><br /> <servlet-name>AddServlet</servlet-name><br /> <!--在html文件中使用的名字 <form action="add" method="post">--><br /> <url-pattern>/add</url-pattern><br /> </servlet-mapping><br /><!-- 1. 用户发请求 action=add--><br /><!-- 2. 项目中 web.xml中找到url-pattern = /add--><br /><!-- 3. 找<servlet-mapping>中的<servlet-name>AddServlet</servlet-name>--><br /><!-- 4. 找<servlet>中的<servlet-name>AddServlet</servlet-name>--><br /><!-- 5. 找com.Han.servlet.AddServlet--><br /><!-- 6. 用户发送的是post请求(method=post),因此tomcat会执行AddServlet中的doPost方法--><br /> <br /></web-app>`
设置编码

Servlet的继承关系
- 继承关系

- 相关方法

小结
Servlet的生命周期


如何解决线程安全性问题:
尽量不要在servlet中定义成员变量,如果一定要定义:
- 不要修改成员变量的值
- 不要根据成员变量的值做一些逻辑判断
Http协议
- HTTP: Hyper Text Transfer Proticol 超文本传输协议。HTTP最大的作用就是确定了请求和响应数据的格式。浏览器发送给服务器的数据:请求报文;服务器返回给浏览器的数据:响应报文。
- Http是无状态的
- Http请求响应包含两个部分:请求和响应
请求报文
- 请求行
POST/dynamic/target.jsp HTTP/1.1
请求行包含三个信息:
- 请求方式- 访问地址URL- HTTP协议的版本(一般都是HTTP1.1)
- 请求头
作用:通过具体的参数对本次请求进行详细的说明
格式:键值对 键和值使用冒号隔开
相对比较重要的请求头:
请求消息头中包含了很多客户端告诉服务器的信息,比如浏览器型号、版本、能接受的内容的类型、发送的内容的类型、内容的长度等等
- 请求体
作用:作为请求的主题,发送数据给服务器
分三种情况:
get方式,没有请求体,但有一个queryString
post方式,有请求体,form data
json格式,有请求体,request payload
响应报文
- 响应行
包含三个信息
- 协议
- 响应状态码
- 响应状态
//200:正常响应
//404:找不到资源
//405:请求方式不支持
//500:服务器内部错误
- 响应头
服务器发送给浏览器的信息(内容的媒体类型、编码、内容长度等)
- 响应体
响应的实际内容
会话
Http是无状态的
— 服务器无法判断两次请求是同一个客户端发过来的 还是不同的客户端发过来的
— 无状态带来的现实问题
— 通过会话跟踪技术解决无状态问题
会话跟踪技术
— 客户端第一次发请求给服务器,服务器获取session,获取不到,则创建新的,响应给客户端
— 客户端给服务器发请求时,会把sessionID带给服务器,服务器判断这一次请求和上次请求是同一个客户端,从而区分不同的客户端
— 常用的API:
request.getSession() —— 获取当前会话,没有则创建新的会话
request.getSession(true) —— 同上
request.getSession(false) —— 获取当前会话,没有则返回null
session.getID() —— 获取sessionID
session.isNew —— 判断当前session是否是新的
session.getMaxInactiveInterval() —— session的非激活间隔时长 默认1800秒
session.setMaxInactiveInterval() —— 设置session的非激活间隔时长
session.inActive() —— 强制让会话失效
session.getLastAcessTime() —— 获取上一次会话时间
session保存作用域
session.getAttribute(“uname”,”lina”) —— 向当前session保存作用域保存一个数据”lina”,对应的key为”uname”
session.setAttribute(“uname”) —— 从当前session保存作用域获取指定的key,也就是uname,所对应的value
服务器端内部转发以及客户端重定向
服务器内部转发
一次请求响应的过程,对于客户端而言,内部经过多少次转发,客户端是不知道的
客户端重定向
两次请求响应的过程,客户端知道请求url有变化
地址栏有变化
Thymeleaf —— 视图模板技术
添加jar包
在web.xml中添加配置
<!--配置上下文参数--><br /><!--配置前缀--><br /><context-param><br /> <param-name>view-prefix</param-name><br /> <param-value>/pages/</param-value><br /></context-param><br /><!--配置后缀--><br /><context-param><br /> <param-name>view-suffix</param-name><br /> <param-value>.html</param-value><br /></context-param>
新建一个Servlet类叫ViewBaseServlet
`import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ViewBaseServlet extends HttpServlet {
private TemplateEngine templateEngine;
@Override
public void init() throws ServletException {
// 1.获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 2.创建Thymeleaf解析器对象
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
// 3.给解析器对象设置参数
// ①HTML是默认模式,明确设置是为了代码更容易理解
templateResolver.setTemplateMode(TemplateMode.HTML);
// ②设置前缀
String viewPrefix = servletContext.getInitParameter(“view-prefix”);
templateResolver.setPrefix(viewPrefix);
// ③设置后缀
String viewSuffix = servletContext.getInitParameter(“view-suffix”);
templateResolver.setSuffix(viewSuffix);
// ④设置缓存过期时间(毫秒)
templateResolver.setCacheTTLMs(60000L);
// ⑤设置是否缓存
templateResolver.setCacheable(true);
// ⑥设置服务器端编码方式
templateResolver.setCharacterEncoding(“utf-8”);
// 4.创建模板引擎对象
templateEngine = new TemplateEngine();
// 5.给模板引擎对象设置模板解析器
templateEngine.setTemplateResolver(templateResolver);
}
/*
执行视图
* @param templateName : 逻辑视图
* @param req : 请求
* @param resp : 响应
* @throws _IOException
*/
_protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 1.设置响应体内容类型和字符集
resp.setContentType(“text/html;charset=UTF-8”);
// 2.创建WebContext对象
WebContext webContext = new WebContext(req, resp, getServletContext());
// 3.处理模板数据
templateEngine.process(templateName, webContext, resp.getWriter());
}
}`
使Servlet继承ViewBaseServlet
根据逻辑视图名称得到物理视图名称
加在自己写的servlet后://此处的视图名称是index<br />//thymeleaf会将这个逻辑视图名称对应到物理视图名称上去<br />//逻辑视图名称:index<br />//物理视图名称:view-prefix + 逻辑视图名称 + view-suffix<br />//所以真实的视图名称为: /index.html<br />super.processTemplate("index", request, response);
使用thymeleaf的标签
https://blog.csdn.net/qq_34598667/article/details/94462934?msclkid=9b0f4575c39a11ec85a0c59d5dc3de8a
th:if
th:unless
th:each
th:text



