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监听

      

      所需类的位置

倍塔塞司
倍塔塞司

AI职业规划、AI职业测评、定制测评、AI工具等多样化职业类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不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号