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 }
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 }
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>
项目结构图
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>
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>
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>
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>
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 }
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>
项目结构图
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 }
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 }
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>
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")