这里是通过jsp(请求)将jsp和Action交互。
通过接受url里面的xx.action拦截请求获取请求名xx。
<struts>
<!-- Convention插件定位视图资源的根路径。默认值为/WEB-INF/content 所以我们需要改 -->
<constant name="struts.convention.result.path" value="/" />
<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<package name="mypakage" extends="struts-default">
Name=Test--->>请求名 也就是url.action中的url
Class=...是转到拦截到请求并转去哪个类处理,这里填的是处理类的路径
<action name="test" class="com.act.actDemo">
Name=success返回success 那么就会以转发的形式跳转到index.jsp
<result name="success" type="dispatcher">index.jsp</result>
</action>
</package>
</struts>
我这里仅仅是在里面获取到request作用域然后传一个值,进行前后台的交互:
package com.act;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class actDemo extends ActionSupport{
@Override
public String execute() throws Exception {
ActionContext.getContext().put("msg", "request作用域");
return SUCCESS;
}
}
前端:
<body>
This is my JSP page. <br>
${msg }
</body>
通过这个例子,可以知道这里配置一种方式实现struts2框架的功能。那么问题来了:这里是Action的配置
<struts>
<!-- Convention插件定位视图资源的根路径。默认值为/WEB-INF/content 所以我们需要改成根目录-->
<constant name="struts.convention.result.path" value="/" />
<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<package name="mypakage" extends="struts-default">
<!-- 可以通过对应的URL:test.action ,默认调用ACtion的execute()方法 -->
<action name="test" class="com.act.actDemo">
<result name="success" type="dispatcher">index.jsp</result>
</action>
<!-- 可以通过对应的URL:test1.action ,调用ACtion的dotest1()方法 -->
<action name="test1" class="com.act.actDemo" method="dotest1">
<result name="success" type="dispatcher">index.jsp</result>
</action>
<!-- 可以通过对应的URL:test1_xx.action ,调用ACtion的xx()方法 (要注意action的定义)-->
<action name="test2_*" class="com.act.actDemo" method="{1}">
<result name="success" type="dispatcher">index.jsp</result>
</action>
<!-- 可以通过对应的URL:test3!xx.action ,调用xx方法-->
<action name="test3" class="com.act.actDemo">
<result name="success" type="dispatcher">index.jsp</result>
</action>
</package>
</struts>
然后我就随便写了个action,要继承ActionSupport类。
package com.act;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
@ParentPackage("struts-default")
public class actDemo extends ActionSupport{
@Override
public String execute() throws Exception {
ActionContext.getContext().put("msg", "execute");
return SUCCESS;
}
public String dotest1() throws Exception {
ActionContext.getContext().put("msg", "dotest1");
return SUCCESS;
}
public String dotest2() throws Exception {
ActionContext.getContext().put("msg", "dotest2");
return SUCCESS;
}
public String dotest3() throws Exception {
ActionContext.getContext().put("msg", "dotest3");
return SUCCESS;
}
@Action(value="dotest4",results={@Result(location="index.jsp")})
public String dotest4() throws Exception {
ActionContext.getContext().put("msg", "dotest4");
return SUCCESS;
}
}
红色的是元数据的配置方法。不需要写XML。还有很多属性没有列出来。
这里是ACtion和JSP之间的交互,我们知道JSP-servlet是有转发和重定向之分。(转发保留request作用域,重定向没有保留。而且URL的变化也是没有,有。)
这里同样也是有转发和重定向的区别。直接xxx.action XXX是@action的value值。
<action name="test3" class="com.act.actDemo">
<result name="success" type="dispatcher">index.jsp</result>
<result name="err" type="dispatcher">xxx.jsp</result>
</action>
我们可以看到在result中有个属性type 这个type就是我们可以配置从Action到JSP之间的跳转方式。若是Action-JSP之间的可以根据需要选择重定向还是跳转。
转发dispatcher 重定向 redirect
在Action中我们可以配置去哪一个JSP,根据需要我们在方法里面Return 的那个String其实就是result的name 去到哪个JSP页面
struts2 核心是拦截器
1.配置首先加入相应的jar包。
2.配置 web.xml增加以下
<filter>
<filter-name>struts2</filter-name>
<filter-class>
<!-- struts2的拦截控制中心 -->
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- struts2的拦截后缀 -->
<url-pattern>*.action</url-pattern>
</filter-mapping>
3.在src目录当中增加struts.xml
-------------------------------------------------------------------------------------
struts.xml配置是以package位单位的
package
name--名字
namespace--工作空间(命名空间)
extends--继承与哪个包
abstract--加入这个属性之后这个包可以被继承
package底下的标签
action
name--请求名
method--处理的方法名,默认execute
class--哪一个类处理
result
name--返回的名字默认("success" )
type--返回类型默认("dispatcher"--转发)
前端aciton可以通过 名字!方法 来调用
-------------------------------------------------------------------------------------
struts2 常量配置
<constant name="xxx" value="yyy" />
struts2为了团队开发分工更明确他加入namespace的机制还有多配置文件引入方式
<include file="文件路径"></include>
-------------------------------------------------------------------------------------
约定Action包名:
要求Action必须放到action、actions、struts、struts2包中。例如:cn.itcast.action、cn.itcast.sturts、cn.itcast.action.user等等。可以使用下面常量来修改Actoin的包
<constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>
---------------------------------------------------------------------------------------
struts2引用标签
<%@taglib uri="/struts-tags" prefix="s"%>
//1.取得servletAPI的session: ServletActionContext.getRequest().getSession()
//ActionContext=值栈的#
//2.通过ActionContext取得的session的代理map
//3.取得servlet API的第三种方式:实现ServletRequestAware接口,有struts2系统自动注入