Java学习路线-62:Struts2

简介: Java学习路线-62:Struts2

一、Struts2 概述

Struts 翻译:支柱


Struts 是流行和成熟的基于 MVC 设计模式的 Web 应用程序框架


POJO(Plain Ordinary Java Object)简单的 Java 对象


MVC 模式


模型视图控制器


Model View Controller


工作原理图

image.png



环境


二、Struts2 项目

项目结构


.

├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── mouday
    │   │           └── HelloWorldAction.java
    │   ├── resources
    │   │   └── struts.xml
    │   └── webapp
    │       ├── WEB-INF
    │       │   └── web.xml
    │       ├── hello.jsp
    │       └── index.html
    └── test
        └── java

1、配置文件


(1)pom.xml

<?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>org.example</groupId>
    <artifactId>java-demo-struts</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <!-- tomcat7插件 maven 命令 tomcat7:run 启动项目-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                    <uriEncoding>UTF-8</uriEncoding>
                    <!--添加忽略war包检查标签,则可以让tomcat7:run指令正常启动tomcat-->
                    <ignorePackaging>true</ignorePackaging>
                    <contextFile>src/main/webapp/WEB-INF/web.xml</contextFile>
                    <contextReloadable>true</contextReloadable>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
    <dependencies>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.5.22</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

(2)src/main/webapp/WEB-INF/web.xml


<?xml version="1.0" encoding="utf-8" ?>
<web-app>
    <display-name>Hello</display-name>
    <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>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

(3)src/main/resources/struts.xml


<?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>
    <package name="default" namespace="/" extends="struts-default">
        <action name="HelloWorldAction" class="com.mouday.HelloWorldAction">
            <result name="">/hello.jsp</result>
        </action>
    </package>
</struts>

2、Action


src/main/java/com/mouday/HelloWorldAction.java
package com.mouday;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        System.out.println("hello action");
        return SUCCESS;
    }
}

3、视图文件


src/main/webapp/index.html

<!DOCTYPE html>
<html lang="en">
  <body>
    hi
  </body>
</html>

src/main/webapp/hello.jsp


<!DOCTYPE html>
<html lang="en">
<body>
hello action jsp
</body>
</html>

4、访问测试


GET http://localhost:8080/
hi
GET http://localhost:8080/HelloWorldAction
hello action jsp

三、核心文件

web.xml
struts.xml
struts.properties 全局属性文件,自动加载

struts.properties 常用配置

# struts.xml改动后重新加载重载 默认 false
struts.configuration.xml.reload=true
# 打开开发模式 默认 false
struts.devMode=true
# 设置浏览器缓存静态页面 默认true
struts.serve.static.browserCache=false
# 被struts处理的请求后缀
struts.action.extension=action,do
# 服务器运行时端口号
struts.url.http.port=8080

四、深入 Struts2

1、访问 Servlet API 方式


ActionContext

实现 Aware 接口

ServletActionContext

2、Action 搜索顺序

逐级向上查找


3、动态方法调用

(1)指定 method 属性


package com.mouday;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
    @Override
    public String execute() throws Exception {
        System.out.println("hello action");
        return SUCCESS;
    }
    public String add(){
        System.out.println("add");
        return SUCCESS;
    }
}

struts.xml(简化)


<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="add" class="com.mouday.HelloWorldAction" method="add">
            <result name="">/add.jsp</result>
        </action>
    </package>
</struts>

访问结果


GET http://localhost:8080/add.action
add result

(2)感叹号方式(不推荐)


参考

struts2.5 使用感叹号和通配符实现动态方法调用无效的问题及解决!


配置文件


<?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>
    <package name="default" namespace="/" extends="struts-default">
        <global-allowed-methods>regex:.*</global-allowed-methods>
        <action name="HelloWorldAction" class="com.mouday.HelloWorldAction">
            <result>/hello.jsp</result>
            <result name="add">/add.jsp</result>
        </action>
    </package>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
</struts>
GET http://localhost:8080/HelloWorldAction!add.action
add result

(3) 通配符方式


<?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>
    <package name="default" namespace="/" extends="struts-default">
        <global-allowed-methods>regex:.*</global-allowed-methods>
        <action name="*_*" method="{2}" class="com.mouday.{1}Action">
            <result name="{2}">/{2}.jsp</result>
        </action>
    </package>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
</struts>
GET http://localhost:8080/HelloWorldAction_add.action
add result

4、指定多个配置文件


<include file="helloworld.xml" />

配置示例


struts.xml


<?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>
    <include file="hello.xml"/>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!-- 以防乱码-->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
</struts>

hello.xml


<?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>
    <package name="default" namespace="/" extends="struts-default">
        <global-allowed-methods>regex:.*</global-allowed-methods>
        <action name="*_*" method="{2}" class="com.mouday.{1}Action">
            <result name="{2}">/{2}.jsp</result>
        </action>
    </package>
</struts>

访问


GET http://localhost:8080/HelloWorld_add.action
add result

5、默认 Action


<?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>
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <action name="index">
            <result>/error.jsp</result>
        </action>
    </package>
</struts>

访问


GET http://localhost:8080/xxxx.action
error jsp

6、Struts2 后缀

(1)struts.xml


<constant name="struts.action.extension" value="html" />

(2)struts.properties


struts.action.extension=action,do

(3)web.xml


<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
        <param-name>struts.action.extension</param-name>
        <param-value>do</param-value>
    </init-param>
</filter>

7、接收参数


(1)Action 属性


Action 类


package com.mouday;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    @Override
    public String execute() throws Exception {
        System.out.println(username);
        return SUCCESS;
    }
}

路由配置


<action name="login" class="com.mouday.LoginAction">
    <result>/login.html</result>
</action>

表单页面


<form action="login.action" method="post">
  <input type="text" name="username" />
  <input type="submit" />
</form>

(2)Domain Model


新建 User 类


package com.mouday.bean;
public class User {
    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}

Action

package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        System.out.println(user.getUsername());
        return SUCCESS;
    }
}

登录表单


<form action="login.action" method="post">
  <input type="text" name="user.username" />
  <input type="submit" />
</form>

(3)ModelDriven


Action


package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    @Override
    public String execute() throws Exception {
        System.out.println(user.getUsername());
        return SUCCESS;
    }
    public User getModel() {
        return user;
    }
}

表单


<form action="login.action" method="post">
  <input type="text" name="username" />
  <input type="submit" />
</form>

(4)接收列表类型


User 类


package com.mouday.bean;
import java.util.List;
public class User {
    private String username;
    private List<String> list;
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}

Action


package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    @Override
    public String execute() throws Exception {
        System.out.println(user.getUsername());
        System.out.println(user.getList());
        return SUCCESS;
    }
    public User getModel() {
        return user;
    }
}

表单


<form action="login.action" method="post">
  <input type="text" name="username" />
  <input type="text" name="list[0]" />
  <input type="text" name="list[1]" />
  <input type="submit" />
</form>

8、处理结果类型

Struts2 处理流程


用户请求
-> Stuts框架
-> 控制器Action
-> Stuts框架
-> 视图资源

result 如果省略 name,则默认是 success

<result name="success">/success.jsp</result>
<!-- 等价于 -->
<result>/success.jsp</result>

4

处理结果类型:


SUCCESS 正确执行,默认视图

NONE 正确执行,不返回视图

ERROR 执行失败

LOGIN 登录视图

INPUT 参数输入界面

Action


package com.mouday.action;
import com.mouday.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    @Override
    public String execute() throws Exception {
        System.out.println(user.getUsername());
        System.out.println(user.getList());
        return SUCCESS;
    }
    @Override
    public void validate() {
        if (user.getUsername() == null || "".equals(user.getUsername())
        ) {
            addFieldError("username", "用户名不能为空");
        }
    }
    public User getModel() {
        return user;
    }
}

配置


<?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>
    <package name="default" namespace="/" extends="struts-default">
        <action name="login" class="com.mouday.action.LoginAction">
            <result>/login.jsp</result>
            <result name="input">/login.jsp</result>
        </action>
    </package>
</struts>

登录框


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@  taglib  prefix="s"  uri="/struts-tags"  %>
<form action="login.action" method="post">
    <input type="text" name="username"/>
    <!-- 显示错误提示 -->
    <s:fielderror name="username"></s:fielderror>
    <input type="text" name="list[0]"/>
    <input type="text" name="list[1]"/>
    <input type="submit" />
</form>

9、局部结果和全局结果

OGNL


<result name="">
    <param name="location">resource</param>
</result>
相关文章
|
7月前
|
前端开发 JavaScript Java
Java学习路线
Java学习路线
152 1
|
7月前
|
Java 开发者
Java 学习路线 2024 最新版!
又对上次分享的 Java 学习路线进行了简单修改完善,并增加了免登录下载和黑夜模式,这里重发一下。 花了一个月零碎的时间,我根据当下 Java 后端求职和招聘的最新要求,对之前写的 Java 后端学习路线进行了全面的优化和改进。
|
6月前
|
前端开发 Java 关系型数据库
Java后台学习路线
Java后台学习路线
61 5
|
5月前
|
Java
图解java工程师学习路线
图解java工程师学习路线
258 0
|
7月前
|
Dubbo Java 应用服务中间件
Java外包是如何进入阿里的熬夜整理出Java后端学习路线
Java外包是如何进入阿里的熬夜整理出Java后端学习路线
|
前端开发 Java 数据库
JSp城市生活信息收集发布网myeclipse开发sqlserver2008数据库BS模式java编程网页结构struts2
JSP城市生活信息收集发布网是一套完善的web设计系统,对理解JSP java编程开发语言有帮助 struts2 dao+bean mvc模式,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008,使用java语言开发,系统主要采用B/S模式开发。
49 0
|
7月前
|
移动开发 搜索推荐 Java
Java如何支持函数式编程?,作为移动开发程序员应该怎样去规划自己的学习路线
Java如何支持函数式编程?,作为移动开发程序员应该怎样去规划自己的学习路线
|
7月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
159 3
|
7月前
|
设计模式 Java 微服务
Java高薪学习路线:解锁Java开发的黄金钥匙
Java高薪学习路线:解锁Java开发的黄金钥匙
201 0
|
7月前
|
Java
java学习路线分享
java学习路线分享