软件设计艺术-从规范到实践
议题
- 一个线上故障
- 一处设计规范
- 一种解决方案
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 多个的时候,先定义,先执行。