目录
一.Struts2基本架构二.Struts2配置文件
三.配置Action
四.动态方法调用
五.配置Result
https://github.com/fulq1234/mystudy/tree/master/struts
一.Struts2基本架构
快捷键ctrl+alt+H,搜索StrutsPrepareAndExecuteFilter
二.Struts2配置文件
struts.xml
1.核心配置文件,主要负责管理Action
2.通常放在WEB-INF/classes,在该目录下面struts.xml可以被自动加载
struts.xml头部代码寻找方法:
jar包struts2-core-2.3.34.jar 下面有struts-2.3.dtd,这里面有struts.xml的头部怎么写的示例。
<struts>
<constant name="" value=""/><!--常量-->
<package name="" namespace="" extends="">
<action name="" class="">
<result name=""></result>
</action>
</package>
</struts>
constant元素
1.配置常量,可以改变Struts2框架的一些行为
2.name属性表示常量名称,value属性表示常量值
这些默认值放置位置struts2-core-2.3.34.jar,下面有/org/apache/struts2/default.properties
package元素
1.包的作用:简化维护工作,提高重用性
2.包可以“继承”已定义的包,并可以添加自己包的配置
3.name属性为必需的且唯一,用于指定包的名称
4.extends属性指定要扩展的包
5.namespace属性定义该包中action的命名空间,可选
除非有令人信服原因,自定义的包应该总是扩展struts-default包
Action在同一个包(package)里面,是不能同名的。
namespace是访问路径的前缀。举例下面方法action的路径是“/user/helloworld”
<package name="default" namespace="/user" extends="struts-default">
<action name="helloworld" class="cn.HelloWorld">
<result name="success">/helloWorld.jsp</result>
</action>
</package>
1.struts-default.xml
Struts2默认配置文件,会自动加载
struts-default包在struts-default.xml文件中定义
2.struts-plugin.xml
Struts2 插件使用的配置文件
加载顺序:
三.配置Action
Action的作用
1.封装工作单元
2.数据转移的场所
3.返回结果字符串
method属性
1.默认值:execute
2.更改属性值实现Action中不同方法的调用
controller
package cn.intro.action;
public class UserAction{
public String login(){
return "alogin";
}
public String register(){
return "aregister";
}
}
struts.xml
<package name="user" namespace="/user" extends="struts-default">
<action name="login" class="cn.intro.action.UserAction" method="login">
<result name="alogin">/login.jsp</result><!--WebContent下面有login.jsp文件-->
</action>
<action name="register" class="cn.intro.action.UserAction" method="register">
<result name="aregister">/register.jsp</result><!--WebContent下面有register.jsp文件-->
</action>
</package>
访问地址如下:
http://localhost:8080/ch01/user/register
http://localhost:8080/ch01/user/register.action
http://localhost:8080/ch01/user/login
http://localhost:8080/ch01/user/login.action
配置默认Action
1.没有Action匹配请求时,默认Action将被执行2.通过<default-action-ref ... />元素配置默认Action
<struts>
<package name="default" extends="struts-default">
<default-action-ref name="defaultAction"/>
<action name="defaultAction"><!--省略class属性,将使用ActionSupport类。并且两个“defaultAction”必须能对应上-->
<result>error.jsp</result>
</action>
</package>
</struts>
四.动态方法调用
动态方法调用
作用:减少Action数量
使用: actionName!methodName.action
禁用: 将属性struts.enable.DynamicMethodInvocation设置false
controller
package cn.intro.action;
public class UserAction{
public String login(){
return "alogin";
}
public String aa(){
return "aregister";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 启用动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="user" namespace="/aa" extends="struts-default">
<action name="user" class="cn.intro.action.UserAction">
<result name="alogin">/login.jsp</result>
<result name="aregister">/register.jsp</result>
</action>
</package>
</struts>
访问的url:
http://localhost:8080/ch01/aa/user!aa.action
http://localhost:8080/ch01/aa/user!login.action
调用方法user!login.action调用UserAction的login()方法
简化Action配置另一种形式的动态方法调用(使用通配符*)
<action name="*User" class="cn.UserAction" method="{1}">
<result>/page/{1}_success.jsp</result>
<result name="input">/page/{1}.jsp</result>
</action>
解释。如果*是add,{1}就是add
举例:
controller
package cn.intro.action;
public class UserAction{
public String add(){
return "input";
}
public String dele(){
return "input";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 启用动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="user" namespace="/" extends="struts-default">
<action name="*User" class="cn.intro.action.UserAction" method="{1}">
<!-- <result>{1}_success.jsp</result> -->
<result name="input">{1}.jsp</result>
</action>
</package>
</struts>
在WebContent增加页面add.jsp和dele.jsp
访问方法
http://localhost:8080/ch01/addUser.action
http://localhost:8080/ch01/deleUser.action
五.配置Result
Result常用结果类型
1.dispatcher:默认结果类型,后台使用RequestDispatcher转发请求
2.redirect:后台使用的sendRedirect()将请求重定向至指定的URL
3.redirectAction:主要用于重定向到Action
<action name="*User" class="cn.UserAction" method="{1}">
<result name="input">/page/{1}.jsp</result>
<result type="redirect">/page/{1}_success.jsp</result>
</action>
controller
package cn.intro.action;
public class UserAction{
private String id = "";//接收的页面的参数
private String message = "";//返回到页面的参数
//... ...id,message的getter/setter方法
public String add(){
if(id.length() == 0){
this.message = "操作失败";
return "input";
}else{
this.message = "操作成功";
return "success";
}
}
public String dele(){
return "input";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 启用动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="user" namespace="/" extends="struts-default">
<action name="*User" class="cn.intro.action.UserAction" method="{1}">
<result>{1}_success.jsp</result>
<result name="input" type="redirect">{1}.jsp</result>
</action>
</package>
</struts>
add_success.jsp
<%@taglib prefix="s" uri="/struts-tags" %>
<body>
<s:property value="message"/>
<s:form action="/addUser.action" method="">
<s:textfield name="id"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
还有add.jsp
访问http://localhost:8080/ch01/add_success.jsp
输入框空的时候,跳转到add.jsp页面,有值得时候,跳转到add_success.jsp页面
全局结果实现同一个包中多个action共享一个结果
<struts>
<package name="default" extends="struts-default">
<global-results>
<result name="error">/page/error.jsp</result>
<result name="login" type="redirect">/page/login.jsp</result>
</global-results>
...省略action的配置...
</package>
</struts>
动态调用(redirectAction)
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 启用动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="user" namespace="/" extends="struts-default">
<!-- 演示动态结果,${nextDispose}表示调用Action的getNextDispose()的方法。获取学员的方法。 -->
<action name="doLogin" class="cn.intro.action.UserAction" method="doLogin">
<result type="redirectAction">${nextDispose}</result>
</action>
<action name="manager">
<result>manager.jsp</result>
</action>
<action name="common">
<result>common.jsp</result>
</action>
</package>
</struts>
login.jsp
<%@taglib prefix="s" uri="/struts-tags" %>
<s:form action="doLogin.action" method="post" theme="xhtml">
<s:textfield name="name" value="xx" label="用户名"></s:textfield>
<s:password name="password" label="密码"></s:password>
<s:checkbox name="manager" label="管理员登录"/>
<s:submit value="提交"/>
</s:form>
有两个文件:common.jsp, manager.jsp
UserAction.java
package cn.intro.action;
public class UserAction{
private String nextDispose = "";
private boolean manager;
//用户登录的逻辑
public String doLogin(){
//省略的登录的逻辑
if(isManager()){
nextDispose = "manager";
}else{
nextDispose = "common";
}
return "success";
}
//nextDispose,manger的getter/setter方法
}
![](https://i-blog.csdnimg.cn/blog_migrate/6ff8aa3cb5f16dfc6ad70f82f60b7c39.png)
运行效果:访问:http://localhost:8080/ch01/login.jsp
如果勾选了复选框,点击登录,就出现manager.jsp页面;如果不勾选复选框,点击登录,就出现common.jsp页面。