前言
首先我们要肯定一下struts2,毕竟struts也引领了一段潮流
【优点】
- 比起传统的servlet+javabean+jsp的模式,struts确实极大地提高了效率
- 重用代码大大增加,软件生产效率和质量也得到了提高
- 使用框架开发,它提供统一的标准,大大降低了我们的后期维护
然而现在struts2已经在被淘汰的边缘
【缺点】
- 配置多个控制器时,手续繁琐,设置返回界面需要手动设置跳转类型
- 控制器(action)中增加了属性以及相应的get和set方法,破坏了控制器的结构,不单一
- struts2好像爆出过一个很严重的安全漏洞,不过新版本应该已经修复
Struts的环境搭建
本文环境:
maven 3.3.9
jdk 1.8
InteliJ IDEA (Eclipse也可以)
Struts 2.5.10
Tip1
不太会安装maven的可以看一下这一篇文章
Tip2
如果对idea下创建web项目不太清楚,可以看一下这一篇文章,详细讲述了maven下创建web项目及服务器的部署
Tip3
关于maven的一点使用建议,大佬绕道就好...在上面的博客中也有讲,看过的直接往下翻
很多人反映使用maven下载jar包下载速度很慢,其实原因很简单,因为maven的远程仓库在国外,所以直接从中央仓库下载肯定速度很慢
可以配置阿里或者其他的镜像下载,速度会很快,具体方法:
首先进入maven安装目录,打开conf文件夹,编辑settings.xml
在mirrors下面配置这一段代码
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central</url>
</mirror>
</mirrors>
Tip4
maven的默认本地仓库是C盘下的.m2下【C:\Users\Administrator\.m2】可以通过配置文件修改本地仓库位置
同样是打开settings.xml,在settings节点下面修改localRepository节点的内容【默认应该是被注释掉了】,换上你的仓库的路径,我填写的绝对路径,相对路劲没测试过
<localRepository>E:\maven-repository</localRepository>
保存即可,在下次创建maven项目的时候就需要选择maven版本,以及相应的配置文件路径了,下面举例讲解
开始配置Struts
1. 创建项目
2. 点击Next,填写项目信息
3. 点击下一步,选择maven的版本以及配置文件
4. next
5. finish
6.修改pom文件,如果对pom不熟悉,直接复制我的代码即可,如果用过直接复制依赖即可
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>top.collegework</groupId>
<artifactId>StrutsDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>StrutsDemo Maven Webapp</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<struts.version>2.5.10</struts.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
</dependencies>
<build>
<finalName>StrutsDemo</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
如果刚才选择了Enable Auto-Import,这里项目就会自动下载相应的依赖,如果没选择,右下角应该还会提示让你Import,点击就会进行下载,下载完成后,可以在项目的Extern Libaries中查看提供的依赖,展开External Libaries,如果下载速度很慢,可能是镜像配置错了,看我上面怎么配的
7. 修改项目结构,在上面提供的第二篇博客中进行了详细的说明,不会的可以看一下,这里直接上修改完成的图,也就是标准的web项目结构图
8. 编写struts.xml文件,不要问我为啥必须起这个名,这是struts的规定,扫描这个文件,如果名称错误,项目无法运行
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="index" class="top.collegework.controller.Controller" method="start">
<result name="success">/success.html</result>
<result name="fail">/fail.html</result>
</action>
</package>
</struts>
<struts>节点:根节点,比如如此,就像html文件的根节点是<html>一样
<package>节点:相当于java中建的包一样,里面可以根据自己的逻辑结构分成多个包,比如我用户类的所有操作,可以建一个包,把所有的控制器(action)放在package下,其中的
- name属性可以随便填,但是不同包不能相同
- namespace属性,根据请求进行拦截,如定义成"/",也就是拦截根请求,例http://localhost:8080/StrutsDemo/index.action,请求的项目下的index.action,就会被这个包拦截,找对应的action进行处理
- extends:直接填写默认的struts-default即可,表示继承自struts-default.xml这个文件,里面定义了一些拦截器,一些默认跳转方式等
<action>节点:也就是所谓的struts2的控制器了,相当于jsp中的servlet
- name属性:控制器的名称,比如表单中的action属性中填写login.action,那么就会去找name属性是login这个控制器
- class属性:这个控制器类的相对路径,必须加上包名,可以看我写的
- method属性:请求这个类中的哪一个方法进行处理,默认是execute();
<result>节点:根据方法的返回值跳转不同界面
如果听着有点懵,那先把项目搭建起来,根据项目在慢慢理解
9. 修改web.xml文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- struts的实质是过滤器,所以需要在web中进行配置 -->
<filter>
<filter-name>struts2</filter-name>
<!-- 有个坑,2.3.36可能没有ng这个包,大家仔细看一下 -->
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 拦截请求后缀为action的请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- 配置欢迎页面 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Struts2的实质是过滤器,因此需要在web.xml中进行配置,进行启动
10. 编写控制器
Controller.java
package top.collegework.controller;
import com.opensymphony.xwork2.ActionSupport;
import top.collegework.domain.User;
public class Controller extends ActionSupport {
private String username;
private String password;
/**
* 获取一个页面
*
* @return 返回的页面在struts进行跳转
* @time 2019年4月11日22:18:37
*/
public String start() {
// 逻辑操作,一般交给service层,这里仅打印测试
User user = new User(username, password);
System.out.println(user.toString());
// 张三就跳转成功页面,否则就跳转失败页面
if (user.getUsername().equals("张三"))
return "success";
else
return "fail";
}
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;
}
}
在struts中实现控制器的类有很多方法,我采用的是比较简单的,直接继承ActionSupport类即可
类中有一个方法是start,对应struts中action标签的method属性
也就是说,当拦截器拦截了请求以后,到struts的配置文件中找到对应的action标签,然后根据这个标签找到扮演这个控制器的类以及这个类中的哪一个方法进行处理,我这里是start方法
struts提供特性就是属性注入,比如通过表单提交了username和password,那么在Action中定义username和password属性,并添加setter方法,就会获得这属性的值,这就是属性注入,相当于servlet中getParameter(" ")【struts是通过拦截器实现的,拦截请求,然后获取参数,在调用set方法进行注入】
我这个控制器实现的功能就是,判断前端登陆的用户,如果是张三则跳到成功页面,否则跳到失败页面
11. 编写一个javabean,并提供get和set方法,以及toString方法,大家粘贴即可,建立一个domain包
User.java
package top.collegework.domain;
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + 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;
}
}
12. 编写html,填写了一个表单,测试属性注入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 请求的action对应struts中action节点的name属性 -->
<form action="index.action" method="post">
<input type="text" name="username" placeholder="username">
<input type="password" name="password" placeholder="password">
<input type="submit" value="提交">
</form>
</body>
</html>
注意的是,input标签的name属性一定要和action中的属性相对应
13. struts节点下的result节点的静态页面的编写
success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>成功页面</h1>
</body>
</html>
fail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>失败页面</h1>
</body>
</html>
项目运行结果: