Struts2 的作用
前台mvc的实现 请求到视图的分离
配置Struts2
在web.xml里配置struts2的过滤器
根据需求配置src目录下的struts2.xml文件
Struts2.xml 标签详解
<struts>
<!-- ----------------------------------------------constant标签------------------------------------------------- -->
<!-- 开发者模式,改了配置文件无需重新部署即可看到效果 -->
<constant name="struts.devMode" value="true" />
<!-- 打开动态方法调用,url后面跟!add 可以指定该action调用的class 方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 指定Struts2默认的ObjectFactoryBean:action实例由spring创建 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 可选值(name, type, auto, constructor,name)(默认name),设置spring的自动装配方式,只有引入spring插件后才有效 -->
<constant name="struts.objectFactory.spring.autoWire" value="type" />
<!--国际化-->
<constant name="struts.custom.i18n.resources" value="messagesource"></constant>
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="629145600"/>
<!-- ------------------------------------------------package标签-------------------------------------------------- -->
<!-- package:利用不同的namespace解决action的name相同的问题,即:前台和后台的index页面 -->
<!-- namespace:定义了访问该package下action里jsp程序的URL路径的格式,即:http://localhost:8088/项目名/front/action名,默认为"",即处理你输入的URL找不到指定的action时候的跳转页面 -->
<package name="global" extends="struts-default" namespace="">
<!-- --------------------------------------------interceptors标签-------------------------------------------- -->
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="defaultStack">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">error</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- --------------------------------------------global-results标签-------------------------------------------- -->
<!-- 公用result ,可以被同package下的其他action实现类返回global-results标签下的result的name值从而访问对应的资源(jsp文件) -->
<!-- 不同的package的extends如果指向包裹global-results标签的package的name(extends="global"),也可以通过其下的action实现类返回global-results标签下的result的name值从而访问对应的资源(jsp文件)-->
<!-- 也能被通过extends公共result的 package 的name 的其他的package 里的action 实现类返回mainpage 从而访问 main.jsp -->
<global-results>
<result name="globalError">/WEB-INF/contents/public/error.jsp</result>
</global-results>
<!-- --------------------------------------------global-exception-mappings标签-------------------------------------------- -->
<!-- 全局申明式异常捕获:所有的action抛出的异常如果没有在对应的exception-mapping中处理,则会在global-exception-mappings中的exception-mapping寻找对应的exception,找到后跳转到global-results中对应result(result name="globalError")-->
<global-exception-mappings>
<exception-mapping result="globalError" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
</package>
<package name="default" namespace="/" extends="struts-default">
<!-- --------------------------------------------default-action-ref标签-------------------------------------------- -->
<!-- 访问该package下不存在的 action时默认返回 name=aa的action -->
<default-action-ref name="aa">
<action name="aa">
<result>/default.jsp</result>
</action>
</default-action-ref>
</package>
<package>
<!-- --------------------------------------------action标签-------------------------------------------- -->
<!-- class:定义了访问该package下action里JAVA程序的路径,即不同的action封装不同的包,该包下的class类必须继承ActionSupport接口,默认调用public String execute()方法,因为ActionSupport接口里封装了一系列我们可以方便调用的方法,然后根据该class返回的值a即为接下来要跳转的result-name=a下面的jsp文件 -->
<!-- method = "a": 不推荐使用:动态指定该使用class类里的a方法,必须有Stringl类型返回值b,再取name=b的result -->
<!-- method:class里有几个方法,就要配置几个不同的action,麻烦.改用在url中指定method的方法,只要一个action,即: /localhost:8088/项目名+namespace/action名/action名!class里的某方法名 或者通配符 -->
<action name="index " class="package包名.class类名" method="add">
<!-- --------------------------------------------result标签-------------------------------------------- -->
<!-- 指定访问该result的页面跳转方式 -->
<!-- 不指定时 默认为 dispatcher 方式,服务器端跳转(jsp:forward) -->
<!-- type="redirect":客户端跳转(目标不能为Action) -->
<!-- type="chain":服务器端forword跳转(目标可以是Action) -->
<!-- type="redirectAction":客户端跳转(目标可以是Action) -->
<result name="a" type="dispatcher">/Hellow.jsp</result>
<result name="b">/World.jsp</result>
</action>
</package>
<!-- --------------------------------------------include标签-------------------------------------------- -->
<!-- 引入指定的strut2.xml文件 -->
<include file="struts/struts-security.xml" />
</struts>
Struts2 的action如何动态调用实现类的指定方法
1.url后面加上 !方法名 指定该action调用的具体方法
2.通配符来实现使配置文件最简化
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
/actions/Teacher_add 即可访问 TeacherAction.java 里的add 方法,如果返回sucess 则 访问 Teacher_add_success.jsp.jsp
Struts2的 action实现类如何接受参数,该参数有什么用
action接受参数的方式
URL格式:http://localhost:8088/项目名+spacename/action名/action名!class里的c方法名?a=1&b=2
action接受参数的方式是调用对应的class里的设置参数的方法:对应的class里要有对应类型的成员变量x,y,seta(){this.x=a}和setb(this.y=b)的方法,才能拿到传递进来的参数,至于c()里怎么用这俩参数无所谓
DomainModel接受参数的方式:
public class UserAction extends ActionSupport {
private User user;
//private UserDTO userDTO;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
ModelDriven接收参数的方式:
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
Struts2的 action实现类如何给request,session,application里塞值
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
//DI dependency injection 依赖注入
//IoC inverse of control 控制反转
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
前台通过s标签或者jsp去获取 request,session,application
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %>
Struts2 如何动态的给将要访问的result 的页面传值
<li><a href="user/user?type=1">传参数</a></li>
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="dispatcher">/user_success.jsp?t=${type}</result>
</action>
</package>
public class UserAction extends ActionSupport {
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
return "success";
}
}
注意 : action实现类里的属性要设置get set 方法