软件设计艺术-从规范到实践
议题
- 一个线上故障
- 一处设计规范
- 一种解决方案

Spring Reactive Stack
Spring Boot 里边说,传统方式。达成 war 包, 实现 一个 接口
SpringBootServletInitializer, 部署到 Servlet 3.0 里边去。
异步在 3.0 都已经实现了。
12.2 SpeciaFication of Mappings
精确匹配
模糊匹配
路径匹配

中文乱码,需要 filter,乱码 filter 前边的 filter 会乱码
Servlet 规范是没有 doGet ,doPost 方法的。
http://localhost:8080/my-servlet?name=111
现在都要 去Servlet 化。
自动装配,和 Spring MVC 拓展接口,
注解驱动。
1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet(name = "myServlet", urlPatterns = "/my-servlet")
public class MyServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.println(name);
writer.flush();
}
}
@ServletComponentScan@WebServlet@WebFilter@WebListener
都是 Servlet 规范里边写的。
07 年3.0 都出来,
Spring MVC 的内容协商都是这个东西。
- Servlet
- JSP
- EL
- JSTL
1
<load-on-startup>1</load-on-startup>
容器启动时加载不加载 数字越小,越早加载。跟延时加载有关系。
他在 Filter 里边设置里边一个 编码,后边又把它写死了。乱上又乱了!!
启动的时候, Filter 之前就已经设置好了。
你写代码要注意一点。
Servlet 规范,有一个规则,如果,调用的时候,你没有设置编码,那么他就会按照默认编码去编码,如果你设置好了以后,就会按照你设置的编码去编码。
Servlet 3.0 开发起来也很简单的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
// 不要忘记调用
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
不要忘记调用 chain.doFilter(request, response)
责任链,一部分是 filter ,一部分是 Servlet ,
在 Filter 里边获取了一次参数
request.getparamter("name");
在 Servlet 里边再次获取了一次参数
request.getparameter("name");
如果你先取出来参数,
情况一:
request.getparamter("name");request.setCharacterEncoding("UTF-8");request.getparamter("name");
这种情况下 设置的编码就没有用了。
情况二:
request.setCharacterEncoding("UTF-8");request.getparamter("name");
这种情况下才行
Servlet 里边的规则,就是 getparamter() 类似于 缓存 ,前边取出来一次以后,怎么改变就没有用了。
Tomcat URlEncoding 默认 ISO-8859-1,
query-Stream ,
- GET
- parameter -> queryString ?name=小马哥
- Tomcat -> server.xml -> connectior -> URIEncoding
- POST
- parameter -> setCharsetEncoding
Tomcat 中的 server.xml 中 Connector 的 URIEncoding 的参数。
1
2
3
4
5
6
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
/>
catalina.bat
1
set "JAVA_OPTS"=%JAVA_OPTS% -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9527
相当于追加了。
当我们用 GET 的时候,需要和 Tomcat 去配合。
GET 的 URI 需要编程 ISO-8859-1
浏览器的的 URI 的 Encoding 是不一样的。流行的都是 UTF-8
当 GET 不会有错, POST 的时候,需要有顺序。
当浏览器不一样的时候,tomcat 写死 UTF-8 就会有错。
Servlet 定义的 filter 多个的时候,先定义,先执行。