# s2sh **Repository Path**: alantop/s2sh ## Basic Information - **Project Name**: s2sh - **Description**: - 了解Struts2基础 - 实现Struts2+Hibernate+Spring框架整合 - **Primary Language**: Unknown - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-11-29 - **Last Updated**: 2022-04-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [TOC] 目标: - 了解Struts2基础 - 实现Struts2+Hibernate+Spring框架整合 # struts入门 image-20201125223558482 image-20201125223642809 image-20201125223720121 # Struts2和springmvc的本质区别 ``` 1.springmvc入口是一个servlet前端控制器( DispatcherServlet ),struts2入口是一filter过滤器(StrutsPrepareAndExecuteFilter). 2.struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action. springmvc通过在coontroller方法中定义形参接收参数,springmvc可以使用单例模式管理controller. 3.springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行 映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method). struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法. 开发中建议使用springmvc,springmvc方法更类似service业务方法. 4.struts2采用值栈存储请求和相应的数据,通过OGNL存取数据,springmvc通过参数绑定期将request请求内容解析,并给方法形参赋值. 5.struts2和springmvc的速度是相当的,由于struts2的漏洞较多,跟多企业使用springmvc ``` # struts基础环境搭建(---重要---) ``` 使用idea工具,maven来构建struts2项目,给大家详细截图讲解下,主要是针对新接触struts2的同学。 大概的步骤如下: 1、新建项目 2、配置pom.xml文件需要的依赖 3、配置web.xml文件 4、添加并配置struts.xml文件 5、添加并编写需要用的jsp文件 6、配置Tomcat 7、动运行 8、报错及原因分析和解决方案 ``` 1.**新建项目** 1.1.选Maven,勾选Create from archetype,然后选中如下图的那条。 ![image-20201129203619541](pic/image-20201129203619541.png) 1.2.输入GroupId和ArtifactId,这两个可以按自己意愿随意输,无需跟下图完全一致。 image-20201129203705703 1.3.直接选择下一步Next,选择本机maven路径 image-20201129203739151 1.4.选择项目本地存储目录;直接完成Finish ![image-20201129203848752](pic/image-20201129203848752.png) 1.5.右下角选择Enable Auto_import,maven会自动加载pom中的依赖jar image-20201129203958012 1.6.项目新建成功的结构如下图 image-20201129204014902 2.配置pom.xml文件的struts2依赖 2.1.在pom.xml的dependencies中添加如下依赖 ```xml org.apache.struts struts2-core 2.5.18 ``` 2.2.效果截图如下 image-20201129204320122 2.3.添加后,会自动加载,效果如下 image-20201129204343737 3.配置web.xml文件,引入struts核心功能——配置过滤器 3.1.向web.xml中添加filter和filter-mapping节点信息 ```xml Archetype Created Web Application struts2 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter struts2 /* ``` image-20201129204525597 4.接下来添加struts.xml文件,并配置 4.1.新建struts.xml文件 image-20201129204804698 4.2.向文件中添加内容,action命名为success,直接指向success.jsp ```xml success.jsp ``` image-20201129204851203 5.添加success.jsp文件 5.1.添加success.jsp文件 image-20201129204915435 5.2.添加title和body信息如下 ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> Success

Success

``` 6.配置tomcat 6.1.从这进入配置页面 image-20201129204957966 6.2.点击加号,然后选择tomcat server,选择后面的local image-20201129205023469 6.3.选择第二个Deployment选项卡,点击右边的加号,选择Artifact image-20201129205137545 6.4.选择如下图的带exploded的,并确定ok image-20201129205203287 6.5.回到上级页面,将Application context改为/,然后apply并ok image-20201129205223720 7.启动运行 7.1.点击右上角的绿色右三角或者下方的run选项卡里的右三角 image-20201129205244431 8.遇到问题和解决方案 8.1.报错,如下图 image-20201129205305990 There is no Action mapped for namespace [/] and action name [success] associated with context path []. 实际操作中该问题除了8.2解决方案;还一种解决方案是关于struts.xml放置路径导致的 image-20201227163344360 ``` **IDEA配置Struts2出现There is no Action mapped for namespace [/] and action name [login]** 在IDEA开发中,只是简单配置了Struts2的环境,一直出这样的错误,后来找了好久,原来。。。。 是位置问题,很多资料都说strust.xml文件是放在src根目录下,其实不对,正确的是放在WEB-INF/classes目录下,然而,用eclipse直接放在src目录下是能运行,这是因为IDE在部署项目时将struts.xml自动拷贝到了WEB-INF/classes下 在IDEA中 解决方法一:struts.xml放到resources目录下 解决方法二:struts.xml放到WEB-INF/classes目录下(没有classes的话,自己创建) ``` 8.2.解决方案:这是因为没法关联到struts.xml,需要操作如下步骤,可以使用ctrl+alt+shift+s,启动该界面,如下图依次操作 image-20201129205328881 image-20201129205352079 image-20201129205410427 8.3可以看到已经有了该关联文件 image-20201129205429710 8.4.再次运行,输入localhost:8080/success,就直接转到了success.jsp页面 image-20201129205456679 # struts工作原理及文件结构 ![image-20201129211057574](pic/image-20201129211057574.png) # struts核心文件 ![image-20201129211225371](pic/image-20201129211225371.png) ![image-20201129211255290](pic/image-20201129211255290.png) image-20201129211314644 ![image-20201129211347497](pic/image-20201129211347497.png) ## Struts.xml配置文件详解  参考文章: - https://blog.csdn.net/weixin_37121625/article/details/55194076 - https://www.cnblogs.com/wkrbky/p/5889328.html ```xml /error.jsp /talk.jsp http://www.sina.com ``` **1、package 元素:** 1.1 作用:方便分模块化开发 1.2 属性: name:必须有。唯一。**标识一个包**, 好有一定的含义。 **extends:继承。一般要求必须继承struts-default的包。不继承该包,将无法使用struts2提供的一些核心功能。struts-default包在struts-default.xml中有配置,加载自己的struts.xml文件之前,框架就已经加载了struts-default.xml配置文件,所以我们可以使用。** abstract:是否是抽象包。让别人继承用的。没有任何action子元素的包就可以声明为抽象包。 **namespace:名称空间。默认值是`""`,称之为默认名称空间。取值一般以/开头。** **namespace和的name共同组成了用户访问的URI.** 如下:URI=/user/hello.action image-20201129212504714 1.3 关于namesapce的搜索顺序问题 ![image-20201129212525026](pic/image-20201129212525026.png) **2、action 元素:** action:定义一个动作 name :动作名称。对应着用户的请求名称,默认的后缀是action或没有后缀 class:框架要实例化的动作类名称,全名称。默认值是:com.opensymphony.xwork2.ActionSupport。在struts- default.xml中有定义。 method:执行的动作类的动作方法。默认值是execute **3、Struts2中的常用常量** default.properties中有 覆盖这些常量时,用后面的配置文件覆盖即可 struts.xml中``来覆盖 | 常量的名称 | 取值 | 说明 | | ----------------------------------------- | ---------- | ------------------------------------------------------------ | | **struts.devMode** | true/false | 开启开发模式。配置文件修改后会自动加载;出错时能打印出更加详细的错误说明。真正运行时要改为false | | struts.i18n.reload | true/false | properties文件修改后会不会被自动加载 | | struts.configuration.xml.reload | true/false | xml配置文件修改后会不会被自动加载 | | **struts.action.extension** | action | struts2框架处理URI后缀。默认是action或者没有。可以配置多个值,用逗号进行分割 | | **struts.i18n.encoding** | UTF-8 | Struts2中使用的默认编码 | | **struts.multipart.maxSize** | 2097152:2M | Struts2中进行文件上传时的文件大小限制 | | **struts.objectFactory.spring.autoWire** | name | 与Spring框架进行集成用的 | | **struts.objectFactory** | spring | 与Spring框架进行集成用的 | | **struts.serve.static.browserCache** | true | 是否允许浏览器进行缓存静态资源 | | **struts.enable.DynamicMethodInvocation** | true/false | 是否允许动态方法调用。 | | struts.ui.theme | xhtml | Struts2UI标签库使用的默认样式主题 | | struts.ui.templateDir | template | 样式模板存在了什么文件夹中。 | **4、多个struts配置文件** user.xml ```xml /success.jsp 1234567891011 ``` struts.xml ```xml 1234 ``` **5、结果视图** **5.1 result元素:** 1. 作用:配置逻辑结果视图。一个动作可以对应多个逻辑视图 2. 属性: - name:逻辑视图名称,和动作类方法的返回值对应。默认是success - type:转向实际视图的方式。默认是dispatcher,转发,目标是一个页面。 > type的取值:从struts-defualt.xml中找 > 1). dispathcer:目标是一个页面,请求转发 > 2). redirect:目标是一个页面,请求重定向 > 3). chain :目标是另外一个动作,请求转发 > 4). redirectAction:目标是另外一个动作,请求重定向 **5.2 result中的参数设置** 1. 下面两种的写法本质上是一样的: ```xml /success.jsp 123 /success.jsp 12345 ``` 1. 转发的目标动作不在同一个包下,而且有着不同的namespace ```xml /p2 demo4 /success.jsp ``` # 深入理解struts2 ## 访问Servelt API image-20201129213444467 image-20201129213532320 image-20201129213559147 ## Action搜索顺序 image-20201129214003451 ## 动态方法调用 image-20201129214119160 image-20201129214454832 ## 指定多个配置文件 image-20201129214620318 ## 默认Action ![image-20201129214854770](pic/image-20201129214854770.png) ## Struts2后缀 该配置可以在三个地方进行设置:web.xml、struct.xml、struct.property 该参数默认不进行设置,可使用请求带.action或者不带.action均可访问(设置了该参数以后需要按照设置的后缀值来访问;但可以将value="",此时需要不带.后缀进行访问) image-20201129215759761 image-20201129215907079 image-20201129215954197 ## 接收参数 image-20201129220108946 **struts2接收参数的5种方法** **以下形式中最常用的是前两种** 1. 使用Action的属性: 在action 里面定义要接收的参数,并提供相应的setter,getter,和提交参数的名称一致, 并不用做数据类型的转换 相应提交方式可以用get 和post 如:testAction? name=admin jsp: ```jsp
用户名:
密 码:
``` java: action: ```java public class TestAction extends ActionSupport{ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` **2. 使用DomainModel:** 在Action 里面不用很多的属性,而是用Model 层用到的模型,保存它的一个对象。相应提交方式可以用get 和post, 如:testAction? resBananRc.name=admin jsp: ```jsp
用户名:
密 码:
``` java action: ```java public class TestAction extends ActionSupport{ //错误的写法,不能自己实例化,struts会自动实例化 private Users users = new Users(); private Users users; public Users getUsers(){ return users; } public void setUsers(Users users){ this.users=users; } ``` entity: ```java public class Users{ private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` **3. 使用DTO--数据传输对象(Data Transfer Object)** 它的作用是接收参数和传递参数,并不是项目中的实体类。 如用户注册时,会用到确认密码,所以要先把参数接收过来,做处理后,再传递给相应方法去创建User 对象。 提交参数的方式的Domain Model 方式的相同。 DTO: ```java public class UserDTO { private String name; private String password; private String confirm; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConfirm() { return confirm; } public void setConfirm(String confirm) { this.confirm = confirm; } } ``` Action: ```java public class TestAction extends ActionSupport{ private static final long serialVersionUID = -7463970150000893325L; private UserDTO userDTO; public UserDTO getUserDTO() { return userDTO; } public void setUserDTO(UserDTO userDTO) { this.userDTO = userDTO; } public void execeute() { System.out.println("姓名: " + userDTO.getName()); } } ``` **4.使用ModelDriven:** 在创建Action 的时候,Action 实现了ModelDriven 接口,去调用接口的getModel()方法,取到了相关对象。 相应提交方式可以用get 和post 如:testAction? name=admin jsp: ```jsp
用户名:
密 码:
``` java action: ```java public class sysAction extends ActionSupport implements ModelDriven{ private User user = new User(); //手动实例化 public User getModel() { return user; //返回实例 } } ``` **5.使用Request对象:** 此方法与与传统的JSP 等传接参数一样,即使用request. getParameter(“”)方法 ```java public class TestAction extends ActionSupport{ private static final long serialVersionUID = -7463970150000893325L; public void execeute() { String name = super.getRequest().getParameter("paraName"); System.out.println("姓名:" + name); } } ``` ## 处理结果类型概述 image-20201129221844145 image-20201129221941494 image-20201129222032419 ## 关于input的代码演示 ## 处理结果类型——局部结果与全局结果 image-20201129222920388 ## 处理结果类型——type属性 ![image-20201129223109082](pic/image-20201129223109082.png) ## struts2中实现返回json格式请求 struts2作为一个mvc框架,请求一个方法,返回一个页面,当post请求成功之后,跳转到success页面,大多数情况下能够满足我们的要求,但是web开发中ajax技术的使用是不可避免的,我们知道ajax请求大多数情况下需要的数据是json格式。我们如何让struts这个mvc框架作为一个restful服务器,提供rest api,显得尤为重要,虽然这时候不能完全体现mvc框架的职能。 struts2实现json请求,可以有两种方式: - 通过struts2-json-plugin插件,这种方式需要在struts.xml中配置action,而且package需要继承json-struts,另外还需要配置结果资源。 - 传统的输出流,向ajax请求写结果。 详见:https://blog.csdn.net/feinifi/article/details/81114268 # Struts2+Hibernate+Spring框架整合 ## [基于SSH实现员工管理系统之框架整合篇](https://www.imooc.com/view/586) ### 开发环境搭建 ```shell ###具体参考 struts基础环境搭建(---重要---) 创建项目 引入pom web.xml中引入Struts2过滤器 --> 创建struts.xml配置文件,配置struct相关package等内容 ``` ### Struts2整合Spring ``` 引入pom web.xml中引入配置Spring的监听器 --> 创建并配置spring的相关配置文件,即可配置bean,又可使用注解的方式进行配置 可以配置各层的bean,bean之间的依赖关系;同时spring还可以集成hibernate,log等组件 ``` ### Spring整合Hibernate ``` 创建entity对象User 在User同目录下创建User对应的映射文件User.hbm.xml,用于表明User和数据库表的对照关系 创建hibernate.cfg.xml;该配置文件用于数据库连接信息,连接池信息以及hibernate配置信息 可以不用创建该hibernate配置文件,完全可在spring配置文件中同步bean进行配置设置 ``` ### 添加事务管理 ```xml 用注解的方式设置事务 通过spring面向切面的方式设置事务 ``` ### Spring mvc集成log4j2(已验证、可用) ```xml https://www.cnblogs.com/fukua123/p/10692247.html #1、配置pom.xml,引用log4j2相关包 org.apache.logging.log4j log4j-api 2.11.2 org.apache.logging.log4j log4j-core 2.11.2 #2、配置简单的log4j2.xml配置文件 #在项目的classpath目录下新建log4j2.xml ####重点: log4j中配置日志文件相对路径方法分析: https://blog.csdn.net/wangjc_opal/article/details/83330005 ./Log4j/logs/dev #3、在web.xml文件里引用log4j2.xml log4jConfiguration classpath:log4j2.xml ``` ## [基于SSH实现员工管理系统之案例实现篇](https://www.imooc.com/view/679) - https://www.cnblogs.com/laibin/p/5847111.html 推荐:hibernate配置文件、各层级间的编写及调用 - https://www.cnblogs.com/cailijia52o/p/8724710.html 推荐:struct、spring整合、配置文件 - https://blog.csdn.net/yjqyyjw/article/details/76855302 推荐:struct.xml、spring配置文件详解,项目整体把控 - https://blog.csdn.net/a745233700/article/details/81193652?utm_source=blogxgwz6 ![image-20201130211551708](pic/image-20201130211551708.png) ![image-20201130211531436](pic/image-20201130211531436.png) image-20201130211624327 image-20201130211640704 image-20201130211705855 image-20201130211722246