软件设计艺术从规范到实践

Posted by NotGeek on December 20, 2018

软件设计艺术-从规范到实践

议题

  • 一个线上故障
  • 一处设计规范
  • 一种解决方案

1545296353950

Spring Reactive Stack

​ Spring Boot 里边说,传统方式。达成 war 包, 实现 一个 接口 SpringBootServletInitializer , 部署到 Servlet 3.0 里边去。

异步在 3.0 都已经实现了。

12.2 SpeciaFication of Mappings

精确匹配

模糊匹配

路径匹配

1545296944983

中文乱码,需要 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 开发起来也很简单的。

1545305528017

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 多个的时候,先定义,先执行。