.Net转Java自学之路—Struts2框架篇二(数据操作)

结果页面配置:

  1、全局结果页面:
    》result标签配置action方法的返回值到不同的路径中。
    》创建俩个action,执行默认的execute方法,让俩个action的方法都返回相同的success,返回success之后,配置到同一个页面中。

<package name="demo" extends="struts-default" namespace="/">
    <action name="ATest" class="cn.test.action.AAction">
        <result name="success">/hello.jsp</result>
    </action>
    <action name="BTest" class="cn.test.action.BAction">
        <result name="success">/hello.jsp</result>
    </action>
</package>

    若多个action,方法中的返回值都一样,到的页面也一样,这个时候可以使用全局结果页面配置。

<package name="demo" extends="struts-default" namespace="/">
    <!-- 全局结果页面配置 -->
    <global-result>
        <result name="success">/hello.jsp</result>
    </global-result>
    
    <action name="ATest" class="cn.test.action.AAction">
    </action>
    <action name="BTest" class="cn.test.action.BAction">
    </action>
</package>

  2、局部结果页面:

<action name="ATest" class="cn.test.action.AAction">
    <result name="success">/hello.jsp</result>
</action>

  同时配置了全局结果和局部结果页面,以局部结果页面为准。

  3、result标签type属性:

    》在result表中中除了name属性之外,还有一个type属性:如何到路径中(转发/重定向)。
      默认转发:转发。值:dispatcher 
      重定向:值 redirect 
    俩个属性值一般针对到页面中配置。
    若配置到其他的actin中用chain、redirectAction:
      chain:转发到action。一般不用,有缓存问题。
      redirectAction:重定向到Action。

<action name="ATest" class="cn.test.action.AAction">
    <result name="success" type="redirectAction">
        BTest
    </result>
</action>
<action name="BTest" class="cn.test.action.BAction">
    <result name="success">/hello.jsp</result>
</action>

在action获取表单提交数据:

  1、使用ActionContext类获取:

    ActionContext.getContext();获取当前线程的ActionContext对象。
    Map<String,Object> getParameters();返回包含HttpServletRequest参数信息。

  2、使用ServletActionContext类获取:

    static HttpServletRequest getRequest();获取HttpServletRequest对象。
    static HttpServletResponse getResponse();获取HttServletResponse对象。
    static ServletContext getServletContext();获取ServletContext对象。
    static PageContext getPageContext();获取PageContext对象。

  3、使用接口注入方式获取:

    让action实现接口,为了得到request对象。接口:ServletRequestAware

  4、在action中操作域对象:

    使用ServletActionContext来操作域对象。

Struts2提供获取表单数据方式:

  Action原始的实现方式:

public String execute(){
    HttpServletRequest request=
        ServletActionContext.getRequest();
    String str1=request.getParameter("")
    String str2=request.getParameter("")
    String str3=request.getParameter("")
    SelfClass sc=new SelfClass();
    sc.setXXX(str1);
    sc.setXXX(str2);
    sc.setXXX(str3);
    return NONE;
}

  而针对复杂的原始写法,封装了几种方式:属性封装、模型驱动封装、表达式封装。

  属性封装:

    》可以直接把表单提交数据封装到action的属性中。
    》步骤:
      a、在action成员变量位置定义变量;变量名称和表单输入项的name属性值保持一致。
      b、生成变量的set/get方法:

class TestAction extends ActionSupport{
    private String uname;
    private String pwd;
    public String getUname(){
        return uname;
    }
    public void setUname(String uname){
        this.uname=uname;
    }
    public String getPwd(){
        return pwd;
    }
    public void setPwd(String pwd){
        this.pwd=pwd;
    }
    
    public String execute() throws Exception{
        return NONE;
    }
}

    》使用属性封装获取表单数据到属性中,不能把数据直接封装到实体类对象中。

  模型驱动封装:

    》使用模型驱动方式,可以直接把表单数据直接封装到实体类对象中。
    》实现步骤:action实现接口 ModelDriven;实现接口中的getModel()方法把创建对象返回;在action中创建实体类对象。

class TestAction extends ActionSupport implements ModelDriven{
    private User user=new User();
    
    public User getModel(){
        return user;
    }
    
    public String execute() throws Exception{
        return NONE;
    }
}

      使用模型驱动封装的前提要求:表单输入项name属性值和实体类属性名称保持一致。
    》使用模型驱动和属性封装注意问题:
      在一个action中,获取表单数据可以使用属性封装或模型驱动封装。两者不能同时使用来获取同一个表单数据。若同时使用,只会执行模型驱动封装。

  表达式封装:

    使用表达式封装也可以把表单数据封装到实体类对象中。
    》在action中声明实体类。并生成实体类变量的get()/set()方法。
    》在表单输入项的name属性值中写表达式形式。

class TestAction extends ActionSupport{
    private User user;
    public User getUser(){
        return user;
    }
    public void setUser(User user){
        this.user=user;
    }
    
    public String execute() throws Exception{
        return NONE;
    }
}

      在表单的name中属性值为:user.uname

<input type="text" name="user.uname" />

    》可以把表达式封装归类到属性封装中。

  比较表达式封装和模型驱动化封装:

    相同点:
      使用表达式封装和模型驱动封装都可以把数据封装到实体类中。
    不同点:
      1、使用模型驱动只能把数据封装到一个实体类对象中。在一个action中不能使用模型驱动把数据封装到不同的实体类对象中。
      2、表达式封装可以把数据封装到不同的实体类对象中。

Struts2获取数据封装到集合中:

  封装到 list 集合:

class TestAction extends ActionSupport{
    private List<User> list;
    public List<User> getList(){
        return list;
    }
    public void setList(List<User> list){
        this.list=list;
    }
    
    public String execute() throws Exception{
        return NONE;
    }
}

  封装到 Map 集合:

class TestAction extends ActionSupport{
    private Set<String,User> set;
    public Set<String,User> getSet(){
        return set;
    }
    public void setSet(Set<String,User> set){
        this.set=set;
    }
    
    public String execute() throws Exception{
        return NONE;
    }
}
posted @ 2019-03-06 10:40  水痕灬  阅读(122)  评论(0编辑  收藏  举报