参考视频:尚学堂
具体视图的返回
可以由用户自己定义的Action来决定
具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容
具体Action的实现可以是一个普通的java类,里面有public String execute方法即可
public class IndexAction1 {
public String execute() {
return "success";
}
}
或者实现Action接口
public class IndexAction2 implements Action {
@Override
public String execute() {
return "success";
}
}
不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法
public class IndexAction3 extends ActionSupport {
@Override
public String execute() {
return "success";
}
}
<action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
在struts2中,这段action会访问IndexAction1类中的返回值为String类型的execute方法。当没有配置class时候,会执行默认的class,即ActionSupport.class,源码在xwork中,可以自己加载出来。
当action没有配置class的时候,默认执行actionsupport.class
源码是xwork.jar的源码,需要下载导入
其内部也有excute方法,返回success
更改jsp编码方式
Window – Preference – 搜索jsp – encoding – Chinese – jsp页面encoding = GB18030可以直接在里面写中文
struts1和2的一个重要区别:
struts1里面action只有一个,会出现线程同步的问题;
struts2里面每次访问action都会创建一个新的,所以不会有这个问题。
路径问题的说明
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
DMI动态方法调用
Action执行的时候并不一定要执行execute方法
public class UserAction extends ActionSupport {
public String add() {
return SUCCESS;
}
}
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
前者会产生太多的action,所以不推荐使用
通配符配置
使用通配符,将配置量降到最低
不过,一定要遵守”约定优于配置”的原则
<package name="actions" extends="struts-default" namespace="/actions">
<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>
</package>
用action的属性接收参数
重要的是set/get方法中的名字和传递参数的语句的属性的名字对应上
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
用DomainModel接收参数
域模型:真正存在的实体概念
简单理解就是把属性封装成一个对象,再使用对象。
用modelDriven接收参数
实现了modelDriven接口:模型驱动
model得自己new,不会自动new了
JUDE(Java and UML Developers’ Environment),一个小巧实用的UML建模软件,不到2M,绝对可以符合UML建模的要求