# 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入门
# 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,然后选中如下图的那条。

1.2.输入GroupId和ArtifactId,这两个可以按自己意愿随意输,无需跟下图完全一致。
1.3.直接选择下一步Next,选择本机maven路径
1.4.选择项目本地存储目录;直接完成Finish

1.5.右下角选择Enable Auto_import,maven会自动加载pom中的依赖jar
1.6.项目新建成功的结构如下图
2.配置pom.xml文件的struts2依赖
2.1.在pom.xml的dependencies中添加如下依赖
```xml
org.apache.struts
struts2-core
2.5.18
```
2.2.效果截图如下
2.3.添加后,会自动加载,效果如下
3.配置web.xml文件,引入struts核心功能——配置过滤器
3.1.向web.xml中添加filter和filter-mapping节点信息
```xml
Archetype Created Web Application
struts2
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
struts2
/*
```
4.接下来添加struts.xml文件,并配置
4.1.新建struts.xml文件
4.2.向文件中添加内容,action命名为success,直接指向success.jsp
```xml
success.jsp
```
5.添加success.jsp文件
5.1.添加success.jsp文件
5.2.添加title和body信息如下
```html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Success
Success
```
6.配置tomcat
6.1.从这进入配置页面
6.2.点击加号,然后选择tomcat server,选择后面的local
6.3.选择第二个Deployment选项卡,点击右边的加号,选择Artifact
6.4.选择如下图的带exploded的,并确定ok
6.5.回到上级页面,将Application context改为/,然后apply并ok
7.启动运行
7.1.点击右上角的绿色右三角或者下方的run选项卡里的右三角
8.遇到问题和解决方案
8.1.报错,如下图
There is no Action mapped for namespace [/] and action name [success] associated with context path [].
实际操作中该问题除了8.2解决方案;还一种解决方案是关于struts.xml放置路径导致的
```
**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,启动该界面,如下图依次操作
8.3可以看到已经有了该关联文件
8.4.再次运行,输入localhost:8080/success,就直接转到了success.jsp页面
# struts工作原理及文件结构

# struts核心文件



## 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
1.3 关于namesapce的搜索顺序问题

**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
## Action搜索顺序
## 动态方法调用
## 指定多个配置文件
## 默认Action

## Struts2后缀
该配置可以在三个地方进行设置:web.xml、struct.xml、struct.property
该参数默认不进行设置,可使用请求带.action或者不带.action均可访问(设置了该参数以后需要按照设置的后缀值来访问;但可以将value="",此时需要不带.后缀进行访问)
## 接收参数
**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);
}
}
```
## 处理结果类型概述
## 关于input的代码演示
## 处理结果类型——局部结果与全局结果
## 处理结果类型——type属性

## 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


