天天看点

SSH框架学习之Struts2(2):接收参数

参考视频:尚学堂

具体视图的返回

可以由用户自己定义的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建模的要求