struts2
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,
Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,
是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系
结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,
这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新
产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
初始配置准备
将所需 jar 包放入 WebContent 下的 WEB-INF 中 lib 文件夹下
创建一个 Action 类
public class HelloAction {
public String hello() {
System.out.println("Hello Struts!");
return "success";
}
}
在 src 下创建 struts.xml 文件
查找 struts 配置文件 DTD
<!-- struts 根标签 -->
<struts>
<!-- package
name: 只要不重复,随便写,可以进行模块化区分
namespace: 命名空间(访问 Action 网址前的一个网址部分)
extends: 继承一个包 struts-default, 默认配置,默认提供的功能 -->
<!-- action
name: 访问该类的路径
class: 该类的全限定类名
method: 该类中被访问的方法 -->
<!-- result
name: 方法的返回值(匹配)
type: 请求跳转的方式(默认:请求转发 dispatcher)
值部分: 跳转网站资源 -->
<package name="hello" namespace="/hello"
extends="struts-default">
<action name="HelloAction"
class="com.hello.HelloAction" method="hello">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
创建 hello.jsp 接收返回值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello World!
</body>
</html>
注意:记住在 web.xml 中配置 struts2的核心过滤器
struts2的核心过滤器不要忘记配置,没有配置前面的准备都是白费的!
<?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">
<display-name>struts2</display-name>
<!-- 配置 struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<!-- win + shift + t
搜索 StrutsPrepareAndExecuteFilter -->
<filter-class>org.apache.struts2.dispatcher.ng.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>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
执行流程
执行流程
1.通过网址请求中的 hello
http://localhost:8080/struts2/hello/HelloAction
2.找对应的命名空间(网址)
3.找到后再通过网址中的 HelloAction 匹配
action 标签中的 name
4.匹配上用 Class 标签创建该类的对象
5.调用该类中的方法
6.拿到类中方法的返回值去匹配 result 标签
7.返回值匹配上,调用标签中的页面
public class DemoAction {
public String defaultfun() {
System.out.println("Action");
return "success";
}
}
<?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>
<!-- 常量配置修改 -->
<!-- /org/apache/struts2/default.properties -->
<!-- default.properties 文件中找到需要修改的配置 -->
<!-- name: 键 value: 值 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--
action,,表示访问路径的后缀名,可以是.action 获取无后缀
-->
<constant name="struts.action.extension" value="action,,"></constant>
<!-- 为配置文件提供热加载(更改完后不用重启服务器) -->
<constant name="struts.devMode" value="true"></constant>
<package name="def" namespace="/def"
extends="struts-default">
<action name="Action"
class="com.def.Action" method="defaultfun">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
<struts>
<package name="hello" namespace="/hello"
extends="struts-default">
<action name="HelloAction"
class="com.hello.HelloAction" method="hello">
<result name="success">/hello.jsp</result>
</action>
</package>
<!-- 引入其他 struts 配置文件 -->
<include file="com/def/struts.xml"></include>
<include file="com/dynamic/struts.xml"></include>
<include file="com/test/struts.xml"></include>
</struts>
动态方法调用测试
public class DemoAction {
public String add() {
System.out.println("增加");
return "success";
}
public String delete() {
System.out.println("删除");
return "success";
}
public String update() {
System.out.println("修改");
return "success";
}
public String select() {
System.out.println("查询");
return "success";
}
}
<?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>
<!-- 常量配置 动态方法(不常用,搜索引擎抓取不好,网址过于复杂 -->
<!-- 默认动态方法是关闭的 -->
<!-- 使用 网址!方法名 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.devMode" value="true"></constant>
<package name="dynamic" namespace="/dynamic" extends="struts-default">
<!-- 使用通配符配置访问路径
*为方法名
method 标签中{1}代表取到前面星获取的方法名 -->
<action name="DemoAction_*" class="com.dynamic.DemoAction" method="{1}">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
Action 类创建方式
创建方式一
随便一个普通类都可以作为一个 Action 类
只需要配置 struts.xml 即可
相比于 servlet 减少代码的侵入性
public class DemoAction {
}
创建方式二
Action 类 创建方式二
实现 Action 接口
意义:在于可以提醒你, Action 类中的方法该如何写
public class DemoAction implements Action {
@Override
public String execute() throws Exception {
return null;
}
}
创建方式三
Action 类 创建方式三(常用创建 Action 类的方式
该类实现了很多接口,一个接口就有一个功能
Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable
public class DemoAction extends ActionSupport {
}
Action 标签的默认值
public class DemoAction {
public String execute() {
System.out.println("Action 标签的默认值");
return "success";
}
}
<?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>
<!--
默认使用的类为 ActionSupport 类
(如果这个类找不到,就去 struts-default 文件下,找默认的类)
默认执行的方法 execute()
默认接收返回值 "success"
默认的跳转方式 请求转发
-->
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.devMode" value="true"></constant>
<package name="test" namespace="/test" extends="struts-default">
<action name="DemoAction">
<result>/hello.jsp</result>
</action>
</package>
**上下两种写法,最后得到的结果是一样的**
<package name="test" namespace="/test"
extends="struts-default">
<action name="Demo06Action_*" class="com.lanou3g.test.Demo06Action" method="{1}">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>