0

0

Struts2框架04 struts和spring整合

PHP中文网

PHP中文网

发布时间:2017-07-09 18:12:46

|

1189人浏览过

|

来源于php中文网

原创

 目录

  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 " id="WebApp_ID" version="2.5">
 3   <display-name>servletVsFilterdisplay-name>
 4   <welcome-file-list>
 5     <welcome-file>index.htmlwelcome-file>
 6     <welcome-file>index.htmwelcome-file>
 7     <welcome-file>index.jspwelcome-file>
 8     <welcome-file>default.htmlwelcome-file>
 9     <welcome-file>default.htmwelcome-file>
10     <welcome-file>default.jspwelcome-file>
11   welcome-file-list>
12   <servlet>
13     <servlet-name>servletservlet-name>
14     <servlet-class>cn.xiangxu.DemoServletservlet-class>
15   servlet>
16   <servlet-mapping>
17     <servlet-name>servletservlet-name>
18     <url-pattern>/servlet.dourl-pattern>
19   servlet-mapping>
20   
21   <filter>
22     <filter-name>filterfilter-name>
23     <filter-class>cn.xiangxu.DemoFilterfilter-class>
24   filter>
25   <filter-mapping>
26     <filter-name>filterfilter-name>
27     <url-pattern>/filter.dourl-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 ">
 2   <modelVersion>4.0.0modelVersion>
 3   <groupId>cn.xiangxugroupId>
 4   <artifactId>ssh02artifactId>
 5   <version>0.0.1-SNAPSHOTversion>
 6   <packaging>warpackaging>
 7   <dependencies>
 8       <dependency>
 9           <groupId>org.apache.strutsgroupId>
10           <artifactId>struts2-coreartifactId>
11           <version>2.3.8version>
12       dependency>
13       <dependency>
14           <groupId>org.apache.strutsgroupId>
15           <artifactId>struts2-spring-pluginartifactId>
16           <version>2.3.8version>
17       dependency>
18   dependencies>
19 project>
maven依赖文件代码

  5.2 配置web.xml

 1 
 2 
 3   ssh02
 4   
 5     index.html
 6     index.htm
 7     index.jsp
 8     default.html
 9     default.htm
10     default.jsp
11   
12   
13   
15   
16       class>org.springframework.web.context.ContextLoaderListenerclass>
17   
18   
19   
20   
21       contextConfigLocation
22       classpath:spring_*.xml
23   
24   
25   
26   
27       mvc
28       class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterclass>
29   
30   
31       mvc
32       /*
33   
34   
35   
36 
web.xml配置文件源代码

    5.2.1 配置spring监听

      

      所需类的位置

Cutout.Pro
Cutout.Pro

AI驱动的视觉设计平台

下载

        

    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/spring-beans-3.0.xsd
10          http://www.springframework.org/schema/context/spring-context-3.0.xsd
11          http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
12          http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
13          http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
14          http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
15          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
16          http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
17          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"> 
 8         <action name="demo" class="cn.xiangxu.TestAction"> 
 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>testtitle>
 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"> 
 8         <action name="demo" class="testAction"> 
 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")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring中文手册
Spring中文手册

共0课时 | 0人学习

马士兵spring视频教程
马士兵spring视频教程

共25课时 | 9.1万人学习

ThinkPHP开发大型商城项目实战视频
ThinkPHP开发大型商城项目实战视频

共54课时 | 21.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号