Struts2

早期流行的JavaWeb框架

配置简介

使用

  1. 创建maven web项目

  2. 引入struts2依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.22</version>
    </dependency>
    <dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>2.5.22</version>
    </dependency>
  3. web.xml配置struts2前端控制器StrutsPrepareAndExecuteFilter

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    </web-app>
  4. 添加struts.xml核心配置文件,配置package(extends=”struts-default”),action(name,class,method),result(name,视图路径)

处理流程

  1. 用户发起请求
  2. 进入前端过滤器,做请求分发
  3. 进入action代理对象,在代理对象中,先执行拦截器链,再执行action方法,action方法完成后,继续逆向执行拦截器链
  4. 得到视图路径

struts.xml配置

基础配置视图解析器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- name自定义一个名字,extends必须写struts-default namespace写上自定义的路径,前面必须加上/ -->
<package name="sys" extends="struts-default" namespace="/sys">
name写指定访问时的URL映射路径,method指的是访问的方法名,class指的是完整的类名
<action name="hello" method="hello" class="io.jtxyh.sys.HelloStruts">
<!-- name 写的是方法的返回值,中间写返回到的视图, -->
<!-- type表示转页面的方式:dispatcher(默认,转发)/redirect(重定向),转action可以写:chain/redirectAction -->
<result name="hello">/index.jsp</result>
</action>
</package>
</struts>
1
2
3
4
// 返回到页面
public String hello(){
return "hello";
}

传指定的数据给前端

1
2
3
4
5
6
7
8
<package name="sys" extends="struts-default" namespace="/sys">
<action name="userInfo" method="userInfo" class="io.jtxyh.sys.HelloStruts">
<result name="userInfo">/index.jsp</result>
</action>
<action name="userList" method="userList" class="io.jtxyh.sys.HelloStruts">
<result name="userList">/index.jsp</result>
</action>
</package>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 成员变量必须有get和set方法
private User u;
private List<User> userList;

// 返回到页面,页面上可以获取到u对象的值
public String userInfo(){
u = new User("张三","20");
return "userInfo";
}

// 返回list
public String userList(){
userList = new ArrayList<>();
userList.add(new User("测试","11"));
userList.add(new User("测试2","12"));
userList.add(new User("测试3","13"));
return "userList";
}

// ....省略了getter和setter方法
1
2
3
4
5
6
7
8
9
10
11
<!-- 页面可以直接用el表达式获取 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>userInfo:${u}</h3>
<h3>userList:${userList}</h3>
</body>
</html>

json数据获取

1
2
3
4
5
6
7
8
9
10
<package name="sys2" extends="json-default" namespace="/sys2">
<!-- 返回json字符串,不走视图解析 -->
<action name="getJson" method="getJson" class="io.jtxyh.sys.SysJson">
<!-- type需要写成json,中间指定param -->
<result name="ajaxUser" type="json">
<!-- name必须为root,中间需要写返回的数据名 -->
<param name="root">user</param>
</result>
</action>
</package>
1
2
3
4
5
6
7
8
9
private User user;

// 返回json字符串,不走视图解析器
public String getJson(){
user = new User("user","19");
return "getJson";
}

// ...省略了getter和setter方法

action转发和重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<package>
<!-- 转发到userList的action去 -->
<action name="goUserList" method="goUserList" class="io.jtxyh.sys.HelloStruts">
<result name="goUserList" type="chain">userList</result>
</action>
<!-- 跨包转发到sys2中的userList -->
<action name="goSysJsonUList" method="goSysJsonUList" class="io.jtxyh.sys.HelloStruts">
<!-- 重定向到其他包的action中 -->
<result name="goSysJsonUList" type="redirectAction">
<!-- 指定跨包的namespace -->
<param name="namespace">/sys2</param>
<!-- 指定跨包的action的name -->
<param name="actionName">userList</param>
</result>
</action>
</package>

动态调用

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 动态方法调用:全局开启动态方法调用,每个包可以控制是严格方法调用或者是动态方法调用
动态方法调用默认!分割 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

<!-- package设置strict-method-invocation="false" -->
<package name="sys" extends="json-default" namespace="/sys" strict-method-invocation="false">
<!-- 自定义一个_作为分隔,!仍然可以使用,{1}代表第一个*中的值 -->
<action name="user_*" method="{1}" class="io.jtxyh.sys.HelloStruts">
<result name="hello">/index.jsp</result>
<result name="userInfo">/index.jsp</result>
<result name="userList">/index.jsp</result>
</action>
</package>

文件上传

  • 需要struts2中的commons-fileupload.jar;commons-io.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 上传的文件对象
private File img;
// 上传的文件名,必须是文件对象名后面加上FileName
private String imgFileName;
// 上传的文件类型,必须是文件对象名加上ContentType
private String imgContentType;

public String fileupload(){
// 获取文件的大小
System.out.println(img.length());
// 文件名字
System.out.println(imgFileName);
// 文件类型
System.out.println(imgContentType);
// 获取保存文件的真实路径
String uploadFilePath = ServletActionContext.getServletContext().getRealPath("uploadFile");
// 创建一个文件,以上传的文件命名,给定保存的位置和名字
File newImg = new File(uploadFilePath,imgFileName);
try {
// 把文件保存,保存到target中去了
FileUtils.copyFile(img, newImg);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

// ...省略了getter和setter方法

配置拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 继承MethodFilterInterceptor
public class MyInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
String invoke = null;
System.out.println("这里写的是前置拦截");
// 从session中获取登录信息
if(ServletActionContext.getRequest().getSession().getAttribute("login") != null){
'放行'
invoke = actionInvocation.invoke();
System.out.println("这里写的是后置拦截");
}else{
// 返回到登录界面
invoke = "gologin";
}
return invoke;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<package name="sys" extends="json-default" namespace="/sys" strict-method-invocation="false">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="interecptorTest" class="io.jtxyh.interceptor.MyInterceptor">
<!-- 不拦截的文件,中间用逗号隔开 -->
<param name="excludeMethods">hello,userList</param>
</interceptor>

<!-- 因为struts2底层也有拦截器,这样写是为了在引用拦截器时不把底层的拦截器覆盖 -->
<interceptor-stack name="myDefaultStack">
<!-- 引用到底层的拦截器,这个顺序不能改变 -->
<interceptor-ref name="defaultStack"/>
<!-- 引用自己的拦截器 -->
<interceptor-ref name="interecptorTest"/>
</interceptor-stack>

</interceptors>

<!-- 这样引用及引用的自己的拦截器,也引用到了底层的拦截器 -->
<default-interceptor-ref name="myDefaultStack"/>

<!-- 设置全局的页面,拦截器拦截后重定向到这个页面 -->
<global-results>
<!-- name对应拦截器返回的字符串,重定向到login页面 -->
<result name="gologin" type="redirect">/login.jsp</result>
</global-results>
</package>

相关文章

数据库连接池

Junit和Spring

Tomcat

Servlet

Request,Response和ServletContext

Cookie和Session

JSP和EL和Jstl

Filter和Listener

Mybatis

SpringCache