• Struts2框架04 struts和spring整合


     目录

      1 servlet 和 filter 的异同

      2 内存中的字符编码

      3 gbk和utf-8的特点

      4 struts和spring的整合

      5 struts和spring的整合步骤

      6 springIOC在action类中的使用

      7 注解回顾

    1 servlet 和 filter 的异同

      1.1 相同点

        filter完全可以代替servlet使用,但是filter中的某些功能servlet不能实现,而servlet的所有功能filter都能实现

      1.2 不同点

        1.2.1 概念上

          servlet 是运行在服务器端的程序,动态生成web页面

          filter 是一段可以复用的代码,不能生成请求和响应,但是可以对相应和请求做相应的处理

        1.2.2 生命周期上

          servlet 是在web服务器启动或web服务器接收到第一次请求时利用构造器实例化servlet,然后调用init方法进行初始化,之后的每次请求会调用doGet或者doPost方法进行处理;当关闭服务器的时候,调用destroy方法销毁实例

          filter 是在web服务器启动时利用构造器实例化filter,然后调用init方法进行初始化,之后的每次请求调用doFilter方法进行处理,关闭服务器的时候,调用destroy方法销毁实例

        1.2.3 类型不同

          servlet是类、filter是接口

      1.3 servlet 、filter的编程实现   

     1 package cn.xiangxu;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * Servlet implementation class DemoServlet
    13  */
    14 public class DemoServlet extends HttpServlet {
    15     private static final long serialVersionUID = 1L;
    16     
    17     /**
    18      * @see HttpServlet#HttpServlet()
    19      */
    20     public DemoServlet() {
    21         super();
    22         System.out.println("01 利用构造器实例化");
    23     }
    24     
    25     @Override
    26     public void init() throws ServletException {
    27         super.init();
    28         System.out.println("02 利用init方法初始化");
    29     }
    30 
    31     /**
    32      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    33      */
    34     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    35         System.out.println("03 调用处理方法");
    36         
    37         response.setContentType("text/html;charset:utf-8"); // 设置消息头部分信息
    38         response.setCharacterEncoding("utf-8");
    39         
    40         PrintWriter out = response.getWriter();
    41         out.println("hello servlet");
    42         out.close();
    43     } 
    44     
    45     @Override
    46     public void destroy() {
    47         super.destroy();
    48         System.out.println("04 利用destroy方法销毁");
    49     }
    50 
    51     /**
    52      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    53      */
    54     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    55         // TODO Auto-generated method stub
    56         doGet(request, response);
    57     }
    58 
    59 }
    DemoServlet
     1 package cn.xiangxu;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.Filter;
     7 import javax.servlet.FilterChain;
     8 import javax.servlet.FilterConfig;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.ServletRequest;
    11 import javax.servlet.ServletResponse;
    12 import javax.servlet.http.HttpServletResponse;
    13 
    14 /**
    15  * Servlet Filter implementation class DemoFilter
    16  */
    17 public class DemoFilter implements Filter {
    18 
    19     /**
    20      * Default constructor. 
    21      */
    22     public DemoFilter() {
    23         System.out.println("01 利用构造器实例化");
    24     }
    25     
    26     /**
    27      * @see Filter#init(FilterConfig)
    28      */
    29     public void init(FilterConfig fConfig) throws ServletException {
    30         System.out.println("02 利用init方法初始化");
    31     }
    32     
    33     /**
    34      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
    35      */
    36     public void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    37         System.out.println("03 调用处理方法");
    38         
    39         HttpServletResponse response = (HttpServletResponse)resp;
    40         
    41         response.setContentType("text/html;charset:utf-8");
    42         response.setCharacterEncoding("utf-8");
    43         
    44         PrintWriter out = response.getWriter();
    45         out.println("hello filter");
    46         out.close();
    47     }
    48     
    49     /**
    50      * @see Filter#destroy()
    51      */
    52     public void destroy() {
    53         System.out.println("04 利用destroy方法销毁");
    54     }
    55     
    56 }
    DemoFilter
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
     3   <display-name>servletVsFilter</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>
    12   <servlet>
    13     <servlet-name>servlet</servlet-name>
    14     <servlet-class>cn.xiangxu.DemoServlet</servlet-class>
    15   </servlet>
    16   <servlet-mapping>
    17     <servlet-name>servlet</servlet-name>
    18     <url-pattern>/servlet.do</url-pattern>
    19   </servlet-mapping>
    20   
    21   <filter>
    22     <filter-name>filter</filter-name>
    23     <filter-class>cn.xiangxu.DemoFilter</filter-class>
    24   </filter>
    25   <filter-mapping>
    26     <filter-name>filter</filter-name>
    27     <url-pattern>/filter.do</url-pattern>
    28   </filter-mapping>
    29 </web-app>
    web.xml

    项目结构图

      

    servlet效果图

      

    filter效果图

      

    2 为什么对内存中的字符进行编码

      字符在服务器内存中是16位的char,网络传输的单位是8为的byte,我们必须对数据进行拆分才能够进行传输,拆分的过程我们叫做编码

    3 描述一下GBK和UTF-8的特点

      utf-8是国际化的最优编码方案,包括了所有的字符,中文占3字节
      gbk是本土化的最优编码方案,包含的字符较少,中文占2字节

    4 struts2 和 spring 整合

      4.1 为什么要进行整合

        使用spring框架管理组件,实现注入,简化代码

      4.2 怎么整合

        导包(struts2 - spring - plugin)

        配置文件(web.xml  spring-struts.xml)

        struts.xml配置文件

    5 利用 struts + spring 实现 hello world 案例

      5.1 导包

        struts2核心包、struts和spring的整合插件包

        

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     2   <modelVersion>4.0.0</modelVersion>
     3   <groupId>cn.xiangxu</groupId>
     4   <artifactId>ssh02</artifactId>
     5   <version>0.0.1-SNAPSHOT</version>
     6   <packaging>war</packaging>
     7   <dependencies>
     8       <dependency>
     9           <groupId>org.apache.struts</groupId>
    10           <artifactId>struts2-core</artifactId>
    11           <version>2.3.8</version>
    12       </dependency>
    13       <dependency>
    14           <groupId>org.apache.struts</groupId>
    15           <artifactId>struts2-spring-plugin</artifactId>
    16           <version>2.3.8</version>
    17       </dependency>
    18   </dependencies>
    19 </project>
    maven依赖文件代码

      5.2 配置web.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
     3   <display-name>ssh02</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>
    12   
    13   <!-- 配置spring监听
    14               目的:容器启动时自动加载一下东西到缓存中 -->
    15   <listener>
    16       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    17   </listener>
    18   
    19   <!-- 配置Spring配置文件的位置 -->
    20   <context-param>
    21       <param-name>contextConfigLocation</param-name>
    22       <param-value>classpath:spring_*.xml</param-value>
    23   </context-param>
    24   
    25   <!-- 配置主控制器和过滤条件 -->
    26   <filter>
    27       <filter-name>mvc</filter-name>
    28       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    29   </filter>
    30   <filter-mapping>
    31       <filter-name>mvc</filter-name>
    32       <url-pattern>/*</url-pattern>
    33   </filter-mapping>
    34   
    35   
    36 </web-app>
    web.xml配置文件源代码

        5.2.1 配置spring监听

          

          所需类的位置

            

        5.2.2 配置Spring配置文件的位置

          

          配置文件所处位置

            

        5.2.3 配置主控制器和过滤条件

          

          所需类的位置

            

      5.3 配置spring_context.xml

         只需要在里面配置组件扫描即可

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
     4     xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
     5     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
     6     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
     7     xmlns:jpa="http://www.springframework.org/schema/data/jpa"
     8     xsi:schemaLocation="
     9         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    10         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    11         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
    12         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
    13         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    14         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
    15         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    16         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    17         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    18 
    19     <!-- 配置组件扫描 -->
    20     <context:component-scan base-package="cn.xiangxu" />
    21     
    22 </beans>
    spring配置文件代码

      5.4 配置struts.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 <struts>
     6 
     7     <package name="test" namespace="/test" extends="struts-default"> <!-- namespace是配置访问路径,extends是配置继承默认struts文件 -->
     8         <action name="demo" class="cn.xiangxu.TestAction"> <!-- name是配置访问网名,class是配置action类 -->
     9             <result name="success">
    10                 /WEB-INF/jsp/msg.jsp
    11             </result>
    12         </action>
    13     </package>
    14     
    15 </struts>
    struts配置文件

      5.5 编写action类

    1 package cn.xiangxu;
    2 
    3 public class TestAction {
    4     public String execute() {
    5         System.out.println("struts整合spring");
    6         return "success";
    7     }
    8 }
    action类代码

      5.6 编写所需的JSP文件

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>test</title>
     8 </head>
     9 <body>
    10     <h2>恭喜你,struts整合spring成功!</h2>
    11 </body>
    12 </html>
    jsp文件代码

      项目结构图

        

    6 struts整合spring后就可以使用springIOC啦

      例如:持久层的action类中通过依赖注入服务层的类,从而就可以使用服务层的相关属性和方法啦

      6.1 案例改进所需的业务层类

     1 package cn.xiangxu.service;
     2 
     3 import org.springframework.stereotype.Service;
     4 
     5 @Service
     6 public class TestService {
     7     public void test() {
     8         System.out.println("我是业务层的数据哟。");
     9     }
    10 }
    增加的service类代码

      6.2 案例改进一

        在action类上添加@Controller注解,这样spring容器就会自动给其增加一个bean

        在action类上添加@Scope("prototype")注解,这样就能让每一个请求都有一个action处理类,如果不写就是所有的请求公用一个action处理类(即:默认时使用单例模式)

        在action类中依赖注入业务层,从而实现控制反转

     1 package cn.xiangxu.action;
     2 
     3 import javax.annotation.Resource;
     4 
     5 import org.springframework.context.annotation.Scope;
     6 import org.springframework.stereotype.Controller;
     7 
     8 import cn.xiangxu.service.TestService;
     9 
    10 @Controller
    11 @Scope("prototype")
    12 public class TestAction {
    13     
    14     @Resource(name="testService")
    15     private TestService testService;
    16     
    17     public String execute() {
    18         System.out.println("struts整合spring");
    19         testService.test();
    20         return "success";
    21     }
    22 }
    action类改进

      6.3 案例改进二

        struts中的action标签中的class属性值可以用相应bean的id代替

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 <struts>
     6 
     7     <package name="test" namespace="/test" extends="struts-default"> <!-- namespace是配置访问路径,extends是配置继承默认struts文件 -->
     8         <action name="demo" class="testAction"> <!-- name是配置访问网名,class是配置action类 -->
     9             <result name="success">
    10                 /WEB-INF/jsp/msg.jsp
    11             </result>
    12         </action>
    13     </package>
    14     
    15 </struts>
    sturts配置文件代码改进

      

    7 注解回顾

      @Component@Controller@Service@Repository

      @Resource@Scope

      @Component 通用的标记(不推荐使用,菜鸟可以使用,【AOP编程时可以使用】)

        格式1:@Controller("指定id")   

        格式2:@Controller  这种方式时使用默认的id,即:类名小写后的值
      @Controller 作用于控制层
      @Service 作用于业务层
      @Repository 作用于持久层

      @Scope 避免线程的安全问题,指定值为“prototype",这样每个请求都会对应一个action处理类;如果不写的话就是单例模式(即:所有请求对应一个action处理类)

        格式:@Scope("prototype")

      @Resource 依赖注入时的声明  

        格式:@Resource(name="依赖注入的id")

        

  • 相关阅读:
    5、依赖倒转原则
    4、开放-封闭原则
    3、单一职责原则
    2013年工作生活总结
    2、策略模式
    1、简单工厂模式
    Unity3D笔记四 基础知识概念
    PythonStudy——PyCharm使用技巧 Column Selection Mode(列选择模式)
    PythonStudy——函数对象的案例
    PythonStudy——函数嵌套定义 Function nesting definition
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/7138694.html
Copyright © 2020-2023  润新知