• Servlet与设计模式


     1 过滤器和包装器

    过滤器可以拦截请求及控制响应,而servlet对此毫无感知。过滤器有如下作用:

    1)请求过滤器:完成安全检查、重新格式化请求首部或体、建立请求审计日志。

    2)响应过滤器:压缩响应流、追加或修改响应流、创建一个完全不同的响应。

    1.1 声明和确定过滤器顺序

    当多个过滤器映射到一个给定资源时,容器会使用先URL模式后servlet-name的规则。

          filter3

          helloServlet

          filter1

          /*

          filter2

          *.action

    过滤器的顺序为: filter1、filter2、filter3

    1.2 过滤器实战

    需求:1)项目只接受/hello 请求的GET方法,对于其他请求则返回“404没有找到对应资源”。2)对所有响应,返回内容结尾都追加“filter实战”。

    1. public class HelloServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. PrintWriter writer = resp.getWriter();
    5. writer.print("你好 Servlet");
    6. writer.close();
    7. }
    8. }
    9. public class RequestFilter implements Filter {
    10. @Override
    11. public void init(FilterConfig filterConfig) throws ServletException {
    12. System.out.println("拦截器初始化");
    13. }
    14. @Override
    15. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    16. HttpServletRequest request = (HttpServletRequest) servletRequest;
    17. String method = request.getMethod();
    18. String servletPath = request.getServletPath();
    19. HttpServletResponse response = (HttpServletResponse) servletResponse;
    20. CustomResponseWrapper responseWrapper = new CustomResponseWrapper(response);
    21. responseWrapper.setContentType("text/html;charset=UTF-8");
    22. if ("GET".equalsIgnoreCase(method) && "/hello".equalsIgnoreCase(servletPath)) {
    23. filterChain.doFilter(request,responseWrapper);
    24. } else {
    25. PrintWriter writer = responseWrapper.getWriter();
    26. writer.print("404没有找到对应资源");
    27. writer.close();
    28. }
    29. }
    30. @Override
    31. public void destroy() {
    32. System.out.println("拦截器销毁");
    33. }
    34. }
    35. public class CustomResponseWrapper extends HttpServletResponseWrapper {
    36. private CustomPrintWriter pw;
    37. public CustomResponseWrapper(HttpServletResponse response) {
    38. super(response);
    39. }
    40. @Override
    41. public PrintWriter getWriter() throws IOException {
    42. if (pw == null) pw = new CustomPrintWriter(super.getWriter());
    43. return pw;
    44. }
    45. }
    46. public class CustomPrintWriter extends PrintWriter {
    47. public CustomPrintWriter(Writer out) {
    48. super(out);
    49. }
    50. @Override
    51. public void print(String s) {
    52. super.print(s + "——filter实战");
    53. }
    54. }
    1. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    4. version="2.4">
    5. <servlet>
    6. <servlet-name>helloServlet</servlet-name>
    7. <servlet-class>HelloServlet</servlet-class>
    8. </servlet>
    9. <servlet-mapping>
    10. <servlet-name>helloServlet</servlet-name>
    11. <url-pattern>/hello</url-pattern>
    12. </servlet-mapping>
    13. <filter>
    14. <filter-name>reqFilter</filter-name>
    15. <filter-class>RequestFilter</filter-class>
    16. </filter>
    17. <filter-mapping>
    18. <filter-name>reqFilter</filter-name>
    19. <url-pattern>/*</url-pattern>
    20. </filter-mapping>
    21. </web-app>

    web.xml 

    2 企业设计模式

    Web系统要求着良好的性能,让用户得到更快的响应时间及支持更多的并发用户;为了让应用不同部分能同时在不同主机上运行,要以适当方式模块化;同时系统还要有一定的灵活性、可维护性和可扩展性。

    2.1 处理远程对象

    在对象跨网络通信时存在一些常见的问题:查找远程对象及处理本地和远程对象之间的底层网络I/O通信。也就是如何找到远程对象,以及如何调用其方法。

    JNDI和RMI可以解决上述的问题。

    2.1.1 JNDI

    Java Naming and Directory Interface,Java命名和目录接口。可以在网络上的一个集中位置上完成查找。想被查找并访问的对象,要先向JNDI注册,再通过JNDI来查找。

    2.1.2 为控制器增加JNDI。

    图 WEB服务请求调用远程服务器服务过程

    业务委托:完成请求的业务处理。

    服务定位器:从JDNI查找需要调用的远程服务。

    2.2 MVC

    Model-View-Controller(模型-视图-控制器)。

    模型:真正的业务逻辑和状态。了解获取和更新状态的规则。

    视图:从控制器得到模型的状态。发起请求及接受响应。

    控制器:从请求取得用户输入,并向模型明确输入用户的含义。

    2.2.1 改进MVC控制器

    控制器的3大任务及处理方案:

    1)获得和处理请求参数,将这个任务交给另外一个单独的表单验证组件,由它获得表单参数、完成转换、进行验证、处理错误并创建一个对象保存参数值。

    2)调用模型,采用声明方式,在定制部署描述文件中列出一些模型,控制器可以读取这些模型,并且根据请求来决定要使用哪些模型。

    3)分派到视图,采用声明方式,根据URL控制器就能区分要分派到哪个视图。

    前端控制器:应用所有的请求都会通过一个控制器,由它处理,并将请求分派到适当地方。

  • 相关阅读:
    日志框架学习
    高并发高可用高性能的解决方案
    AOP切面实现增删改防止重放攻击
    分类预测 | MATLAB实现PSO-DBN粒子群优化深度置信网络多输入分类预测
    支付宝支付接入流程
    港陆证券:服装家纺公司上半年投资并购力度加大
    linux ld 链接器学习笔记
    SkyWalking内置MQE语法
    C#基础入门教程-方法
    Nginx+Tomcat 搭建负载均衡、动静分离
  • 原文地址:https://blog.csdn.net/qq_25308331/article/details/133828112