Strusts入门XML配置-action编写
入门操作
创建Web项目
引入jar包
一、将Strusts2文件夹中apps目录下的struts2-blank.war文件复制到tomcat文件夹中的webapps目录下
二、运行tomcat,struts2-blank.war文件自动解压
三、解压后,进入“apache-tomcat-8.5.30\webapps\struts2-blank\WEB-INF\lib”文件目录下的jar包就是我们需要的。
编写Action类
/**
* Strusts入门的Action类 可以不用继承任何类或实现任何接口
* @autho ban
* @date 2019/4/13 10:34
*/
public class HelloAction {
/*
* 提供返回类型为String的公有无参方法
* */
public String execute(){
System.out.println("HelloAction");
return null;
}
}
对Action进行配置
在src下创建(提供)一个名称为struts.xml的配置文件,注意这个名称是固定的,区分大小写。
- 在“apache-tomcat-8.5.30\webapps\struts2-blank\WEB-INF\classes”目录下有一个struts.xml配置文件,可以拿过来进行修改使用
删除struts标签中的内容,再配置Struts2的包
<?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>
<!-- name:包名可以随便写不过一个配置当中不能重复-->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action name要与访问的路径一致,class就是action类的全路径 -->
<action name="hello" class="net.zjitc.struts.demo.HelloAction"></action>
</package>
</struts>
< package>标签中的extends的值是继承Strusts2提供的一个东西,
配置前端控制器(核心过滤器)
那怎么配置这个核心过滤器呢?
在web.xml配置文件中直接配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Strusts2的核心过滤器-->
<filter>
<filter-name>strusts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>strusts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
进行页面跳转
一、修改Action中方法的返回值
/**
* Strusts入门的Action类 可以不用继承任何类或实现任何接口
* @autho ban
* @date 2019/4/13 10:34
*/
public class HelloAction {
/*
* 提供返回类型为String的公有无参方法
* */
public String execute(){
System.out.println("HelloAction");
return “success”;
}
}
二、修改struts.xml配置文件
<?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>
<!-- name:包名可以随便写不过一个配置当中不能重复-->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action name要与访问的路径一致,class就是action类的全路径 -->
<action name="hello" class="net.zjitc.struts.demo.HelloAction">
<result name="success">目标页面路径</result>
</action>
</package>
</struts>
Strusts2执行的流程
用户访问某个Action时,首先经过核心过滤器,在核心过滤器中执行一组拦截器(实现部分功能),执行目标Action,根据Class的返回值,来进行页面跳转。
strusts2的相关配置介绍
strusts2.xml
package标签
属性名 | 作用 |
---|---|
name | 包的名称,在一个项目中不能重名 |
extends | 继承哪个包 ,一般情况下为“struts-default” |
namespace | 名称空间,与< action>标签的name属性来决定访问路径 |
abstract | 用于其他包的继承 |
action标签
属性名 | 作用 |
---|---|
name | 与< package>标签的namespace属性决定访问路径 |
class | 需要执行的Class的全路径 |
method | 执行action中的哪个方法名,默认值为“execute” |
converter | 自定义类型转换 |
strusts2的常量配置
strusts2的常量配置在jar包下的org.apache.strusts下的default.properties中
常量 | 作用 |
---|---|
struts.i18n.encoding=UTF-8 | strusts2中所有的post请求的中文乱码不用处理 |
struts.action.extension=action,, | strusts2请求的默认扩展名为“.action"或不写 |
修改常量配置文件default.properties
- strusts.xml中进行修改(推荐使用)
使用< constan>标签,规定:对于default.properties的修改要放在最上面 - strusts.properties" 中进行修改
- web.xml中进行修改
使用filter标签下的< init-param>标签
注意:如果使用了多个方法进行,那么要考虑它们的优先级。
< include> 标签的使用(团队开发使用)
< include>标签的作用是引用外部的struts的配置,类似于外部链接的css样式或js,在团队开发中,每个人有自己的开发的模块,那么到最后的整合中,就可以使用< include>标签完成strusts.xml的整合,
例如:张三负责了资产借还模块的开发,他有一个资产借还的strusts_assetsBorrowing.xml配置文件,李四负责资产类别模块的开发,他有一个资产类别的strusts_assetClass.xml配置文件,那后期整合可以这么做:
<?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>
<include file="net/zjitc/assetsBorrowing/struts_assetsBorrowing.xml"></include>
<include file="net/zjitc/assetClass/strusts_assetClass.xml"></include>
</struts>
Action类的访问
Action的编写
- POJO类
POJO类就是一个简单的类,没有实现任何接口,也没有继承任何类,前面我们使用的Action类(HelloAction)就是一个POJO类。 - 实现一个Action的接口
implements Action , 实现接口后有一个默认的方法
import com.opensymphony.xwork2.Action;
/**
* @version 1.0
* @autho ban
* @date 2019/4/13 10:34
*/
public class HelloAction implements Action {
@Override
public String execute() throws Exception {
System.out.println("实现接口类的Action执行了...");
return null;
}
}
这种方式,提供了五个常量(逻辑视图的名称)
常量名 | 作用 |
---|---|
SUCCESS | 成功 |
ERROR | 失败 |
LOGIN | 登录错误页面跳转 |
INPUT | 表单检验是出错,或类型转换出错,这个的值是不允许修改的 |
NONE | 不跳转 |
- 继承ActionSupport类(推荐使用)
import com.opensymphony.xwork2.ActionSupport;
/**
*ActionSupport中提供了数据校验,国际化等一系列操作的方法
* @version 1.0
* @autho ban
* @date 2019/4/13 10:34
*/
public class HelloAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("继承ActionSupport类的Action执行了...");
return NONE;
}
}
通过method来进行Action的访问
<?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>
<!-- name:包名可以随便写不过一个配置当中不能重复-->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action name要与访问的路径一致,class就是action类的全路径 -->
<action name="studentFind" class="net.zjitc.struts.demo.HelloAction" method="find"></action>
<action name="studentDelete" class="net.zjitc.struts.demo.HelloAction" method="delete"></action>
</package>
</struts>
但这种方法,还是比较麻烦,因为我们每访问一个不同的方法就需要写一条< action>的配置
通过通配符来进行Action访问(常用)
jsp的body代码如下
<body>
<a href="${pageContext.request.contextPath}/student_find.action">查找学生</a>
<a href="${pageContext.request.contextPath}/student_delete.action">删除学生</a>
</body>
比较简单的写法
<?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="demo" extends="struts-default" namespace="/">
<action name="student_*" class="net.zjitc.struts.demo.StudentAction" method="{1}"></action>
</action>
</package>
</struts>
action中的{1}则是获取到action的name属性中第一个"“的值,而这个”“是一个通配符,表示任意个任意字符,例如点击了<a href="${pageContext.request.contextPath}/student_find.action">查找学生</a>
这个链接,那么访问的是"student_find"的action那么的值就是”find",如此一来就会执行StudentAction类中的find()方法。
更抽象的写法
<action name="*_*" class="包的路径.{1}" method="{2}"></action>
{1}是name值中的第一个"",获取到的是具体的类名,{2}则是name值中的第二个"",获取到的是具体的方法名,这种写法的一个前提是要action的名称(即name)要和访问的action名称一致,且两个之间要有分割符
通过动态方法进行Action的访问
strusts.xml的配置
<?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="demo" extends="struts-default" namespace="/">
<action name="student" class="net.zjitc.struts.demo.StudentAction" method="{1}"></action>
</action>
</package>
</struts>
打开动态方法访问
首先我们找到default.properties文件中的struts.enable.DynamicMethodInvocation常量,可以看到默认值是false,这代表着动态方法访问是关闭的,想要是用这种方法就必须打开动态方法访问,那么我们就可以将该常量值设置为true
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
编写访问路径
<body>
<a href="${pageContext.request.contextPath}/student!find.action">查找学生</a>
<a href="${pageContext.request.contextPath}/student!delete.action">删除学生</a>
</body>
访问路径个格式是固定的,首先要写action的name,其次必须写一个"!"符号,之后写的是方法名,例如<a href="${pageContext.request.contextPath}/student!find.action">查找学生</a>
中的“student!find.action”,"student"是action的name,"find"是方法名