00-struts入门
2018-06-21 本文已影响22人
何惧l
- 基本配置
- 关于方法调用 action
- 转发与重定向 result
基本配置
- 新建一个Web动态项目struts
- 导入需要的jar包,复制到WEB-INF/lib下
链接:https://pan.baidu.com/s/1p9YbyjWINLnQHD0Qw4yopg 密码:u8wh - 在web.xml文件中
- 配置一个Filter,所有的请求都给过滤给
org.apache.struts2.dispatcher.ng.filter
下的StrutsPrepareAndExecuteFilter
- 配置一个Filter,所有的请求都给过滤给
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<filter>
<!-- 给过滤器程序设计一个匿名 -->
<filter-name>mystruts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>mystruts</filter-name>
<!-- 指出访问路径对应的匿名的路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
- 创建一个处理类
- 创建一个包,action,创建一个类TestAction,写一个方法
- 一会配置完成后执行的就是这个方法
package action;
public class TestAction {
public String test() {
System.out.println("public: test....");
return "mystruts";
}
}
- 配置struts.xml
- 在src目录下创建一个struts.xml文件,下面是最简单的配置信息
- 效果是当访问test路径的时候服务器跳转到NewFile.jsp
<?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标签:用于创建一个包,实现Action在逻辑上的包装,类似于java中的包
namespace属性:设置命名空间,类似servlet注册中的虚拟目录默认为'/'
extends属性: 设置当前的继承指定的包,通常就继承这个包`struts-default`
-->
<package name="strutstest" namespace="/" extends="struts-default">
<!-- action标签:创建一个业务标签,实现请求一个Action的映射
name属性:设置一个请求名,也就是你访问的路径
class属性:指出当前action处理类,属性值为类全名
method属性:指出处理类中的那个方法处理当前的请求
-->
<action name="test" class="action.TestAction" method="test">
<!-- result标签:创建一个响应映射,实现视图名到视图
name属性:属性为视图名,当试图类的处理方法返回的试图名与当前name值相同时,返回
这个视图
type属性:设置响应试图文件的方法,响应方式,默认是转发
-->
<result name="mystruts">/NewFile.jsp </result>
</action>
</package>
</struts>
- 在NewFile.jsp就写一句,然后启动,访问
http://localhost:8080/struts/test
此时上面那个方法就会执行了,也访问了这个视图
-
整体流程
- 所有的访问都会被web.xml中的配置的Struts的Filter所拦截
- 拦截之后就会进入到struts的工作流程
- 访问的地址是/test,根据struts按照struts.xml中的配置,服务器跳转到NewFile.jsp
- 显示NewFile.jsp页面
-
注意事项
- struts2的配置文件必须是struts.xml
- 这个配置文件必须在src下面
-
struts.xml中搜索
多级搜索:- struts.xml 针对请求路径映射规则为:先根据命名空间搜索package标签,当找到包之后根据action名搜索action标签
包搜素: - 若根据原命名空间找不到package标签,struts2自动后退一层目录,然后将新目录作为命名空间,寻找package标签,以此类推,找到package将不再寻找,否则报错
action搜素: - 根据action名若在当前包中找不到相关的action标签,自动到默认包中(namespace为空白就是/根目录)中找到相关的action标签,若没有就报错
- struts.xml 针对请求路径映射规则为:先根据命名空间搜索package标签,当找到包之后根据action名搜索action标签
先执行包多级搜素在进行action多级搜索,它们是独立的
关于方法调用 action
- 占位符的方式
- 首先是在action中定义好方法
package action;
public class TestAction {
public String test() {
System.out.println("public: test....");
return "mystruts";
}
public String select() {
System.out.println("public: select....");
return "mystruts";
}
public String insert() {
System.out.println("public: insert....");
return "mystruts";
}
public String update() {
System.out.println("public: update....");
return "mystruts";
}
public String delete() {
System.out.println("public: delete....");
return "mystruts";
}
}
- 然后在struts.xml中进行配置,其中action的name值设置有占位符,为*号,然后在method中使用{1}的方式来获取,这样更加方便
<?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>
<!-- 占位符:调用action类中的方法,name = action_* method="{1}" ,这里面的值就是*代表的值-->
<package name="strutstest3" extends="struts-default">
<action name="test_*" class="action.TestAction" method="{1}">
<result name="mystruts">/NewFile.jsp</result>
</action>
</package>
</struts>
- 在NewFile.jsp页面中就可以这样写了,其中当你点击增加的时候,就会执行对应的insert方法
<body>
<!-- 占位符 -->
<a href="test_insert">增加</a>
<a href="test_update">更改</a>
<a href="test_delete">删除</a>
<a href="test_select">查询</a>
</body>
- 动态调用
- action中定义的方法不变
- 在struts.xml中进行配置,其中action中不用指定方法
- 但是要设置这个属性为true
<?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>
<!-- 必须设置这个属性为true-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 占位符:调用action类中的方法,name = action_* method="{1}" ,这里面的值就是*代表的值-->
<package name="strutstest3" extends="struts-default">
<!-- 动态调用 方法名不用指定了 -->
<action name="test" class="action.TestAction">
<result name="show">/NewFile.jsp</result>
</action>
</package>
</struts>
- 在NewFile.jsp中使用
action路径 ! 方法名
这种方法来调用,其中当你点击增加的时候,就会执行对应的insert方法
<body>
<!-- action路径 ! 方法名 -->
<a href="test!insert">增加</a>
<a href="test!update">更改</a>
<a href="test!delete">删除</a>
<a href="test!select">查询</a>
</body>
转发与重定向 result
result标签 : 定义指定视图对应的响应自愿[视图名与视图文件的映射]
-
name属性:设置当前result标签代表的视图名,默认为sucess
-
type属性:设置响应视图文件的方式[响应方式],默认为dispatcher转发
- dispatcher:可以转发到指定的页面
- chain:可以转发到同包或异包中的action
- redirect:可以重定向到指定页面或同包\异包action
- redirectAction:可以重定向到同包或异包的action
-
转发的时候指定到action,第一个标签是找到根目录,然后再找到action名为select的
<action name="delete" method="delete" class="com.md.Action.YirenAction" >
<result name="delete" type="chain">
<param name="namespace">/</param>
<param name="actionName">select</param>
</result>
<result name="error">/error.jsp </result>
</action>