`
ye5562402
  • 浏览: 7873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

preparable和ModenDriven拦截器

阅读更多
最近读starting struts2 online,里面有一节Move CRUD Operations into the same Action,提供了Move CRUD Operations into the same Action大概的sample,于是进行了补充,记录下来,以备使用。

一、思路
在这本书里,lan roughley提到在结合preparable和ModenDriven拦截器实现Move CRUD Operations into the same Action,采用通配符的方式为所有的crud只写一个action配置,当然,这也要求相关文件的命名和目录组织的时候要遵循一定的要求,示例如下:

<action name="**" 的形式似乎不行,不得以改成了"*_*"了,哈哈,要是能改成"^_^"就更好了
注:在struts.xml中增加<constant name="struts.enable.SlashesInActionNames" value="true" />,可以使用"*
    public String delete() throws Exception {
        log.info("delete the person");
        service.deletePerson(id);
        return SUCCESS;
    }

   
    public String edit() {
        return "input";
    }

   
    public String update() throws Exception {
        if (id == null || id.length() == 0) {
            log.info("add the person");
            service.addPerson(person);
        } else {
            log.info("update the person");
            service.updatePerson(person);
        }
        return SUCCESS;
    }

   
    public String view() {
        return SUCCESS;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public PersonService getService() {
        return service;
    }

    public void setService(PersonService service) {
        this.service = service;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Person getModel() {
        return person;
    }
}
 

PersonListAction.java  :


package com.work.action.person;

import java.util.List;

import com.work.action.BaseSupport;
import com.work.model.Person;
import com.work.service.PersonService;

public class PersonListAction extends BaseSupport {
    private static final long serialVersionUID = 1810482163716677456L;
    private List<Person> people;
    private PersonService service=new PersonServiceImpl(); ;

    public String execute() throws Exception {
        log.info("list persons");
        people = service.getAllPersons();
        return SUCCESS;
    }

    public List<Person> getPeople() {
        return people;
    }

    public void setPeople(List<Person> people) {
        this.people = people;
    }

    public PersonService getService() {
        return service;
    }

    public void setService(PersonService service) {
        this.service = service;
    }
}
paramsPrepareParamsStack
这里需要说一下关键的paramsPrepareParamsStack拦截器,其中params拦截器出现了两次,第一次位于servletConfig和prepare之前,更在modelDriven之前,因此会将http://localhost:8080/diseaseMS/person/Person_edit.action?id=202中的参数id注入到action中,而不是model中,之后prepare将根据这个id,从服务层提取model。

下面是paramsPrepareParamsStack的英文注释:

An example of the params-prepare-params trick. This stack  is exactly the same as the defaultStack, except that it  includes one extra interceptor before the prepare interceptor:the params interceptor.
This is useful for when you wish to apply parameters directly to an object that you wish to load externally (such as a DAO or database or service layer), but can't load that object  until at least the ID parameter has been loaded. By loadingthe parameters twice, you can retrieve the object in the prepare() method, allowing the second params interceptor toapply the values on the object.

 


<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="params"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
</interceptor-stack>
PersonServiceImpl.java

package com.work.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.work.model.Person;

public class PersonServiceImpl implements PersonService {
   
    private List<Person> personList;

    public PersonServiceImpl() {
        personList = new ArrayList<Person>();
        Person p1 = new Person("202", "name1", "beijing");
        Person p2 = new Person("203", "name2", "beijing");
        Person p3 = new Person("204", "name3", "tianjing");
        personList.add(p1);
        personList.add(p2);
        personList.add(p3);

    }

    public void addPerson(Person person) {
        if (person == null) {
            throw new RuntimeException("add kong");
        }
        person.setId(getID(200));
        personList.add(person);
    }

    public void deletePerson(String personID) {
        int target = findLocation(personID);
        if (target != -1)
            personList.remove(target);
    }

    public List<Person> getAllPersons() {
        return personList;
    }

    public void updatePerson(Person person) {
        if (person == null) {
            throw new RuntimeException("update kong");
        }
        int target = findLocation(person.getId());
        personList.remove(target);
        personList.add(person);
       
    }

    private int findLocation(String personID) {
        int target = -1;
        for (int i = 0; i < personList.size(); i++) {
            if (personID.equals(personList.get(i).getId())) {
                target = i;
                break;
            }
        }
        return target;
    }

    public Person find(String personID) {
        Person person = null;
        int target = findLocation(personID);
        if (target != -1) {
            person = personList.get(target);
        }
        return person;
    }
   
    private String getID(int round) {
        Random rand = new Random();
        int needed = rand.nextInt(round) + 1; // 1-linesum+1
        return needed+"";
    }

}

下面就是jsp文件了,就只贴部分了:edit.jsp:
<s:form action="Person_update.action" >
    <s:textfield label="your ID" name="id" readonly="true"/>
    <s:textfield label="Please enter your name" name="name" required="true"  />
    <s:textfield label="Please enter your homeaddr" name="homeAddr" required="true"/>   
    <s:submit />
</s:form>

view.jsp

 

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>person view</title>
</head>

<body>
<s:actionerror />
<table>
    <tr>
        <td>id</td>
        <td>name</td>
        <td>address</td>
        <td></td>
        <td></td>
    </tr>
    <s:iterator value="people">
        <tr>
            <td><s:property value="id" /></td>
            <td><s:property value="name" /></td>
            <td><s:property value="homeAddr" /></td>
            <td><s:url id="update" action="Person_edit.action" >
                <s:param name="id">
                    <s:property value="%{id}" />
                </s:param>
            </s:url> <s:a href="%{update}">修改</s:a>
            </td>

            <td><s:url id="delete" action="Person_delete.action">
                <s:param name="id">
                    <s:property value="%{id}" />
                </s:param>
            </s:url> <s:a href="%{delete}">删除</s:a>
            </td>
        </tr>
    </s:iterator>
</table>
<ul>
    <li><a href="<s:url action="Person_input"/>">Create a new person</a></li>

</ul>
</body>
</html>


三、总结
优点:适用与crud比较的应用程序,大幅减少action的配置信息

其他:

1、也可以不实现modeldriven接口,只不过要在jsp中加上model.properity

2、这种方式在某种程度上透露了action中的方法名称给客户端,是否会带来安全性的问题



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cmtony2008/archive/2009/04/30/4138818.aspx
分享到:
评论

相关推荐

    Java详解ModelDriven和Preparable拦截器.doc

    Java详解ModelDriven和Preparable拦截器 本资源主要讲解了Java中的ModelDriven和Preparable拦截器,旨在解决Action类中包含JavaBean的业务属性的问题。通过使用ModelDriven拦截器,可以将冗余代码抽取出来,把操作...

    [尚硅谷]_封捷_ModelDriven和Preparable拦截器.pdf

    ### [尚硅谷]_封捷_ModelDriven和Preparable拦截器 #### 一、引言 在Struts2框架中,为了提高代码的可维护性和可读性,开发人员经常使用到`ModelDriven`和`Preparable`这两种拦截器。本文档旨在通过分析这两种拦截...

    理解拦截器用于在某个方法或字段被访

    Struts 2框架提供了一系列内置的拦截器,这些拦截器可以通过配置文件(如struts-default.xml)进行定制和组合。以下是一些常用的Struts 2拦截器: - **Alias Interceptor**:允许在不同请求之间转换请求参数的...

    struts2内置拦截器简介

    通过拦截器可以对请求进行预处理或后处理,使得代码更加模块化和易于维护。Struts2提供了一系列内置的拦截器,这些拦截器可以方便地被添加到配置文件中来增强应用的功能。 #### 1. 概述 Struts2的内置拦截器主要...

    struts 拦截器,扩展,以及java annotation

    - 除了拦截器,还可以扩展Action类,例如,通过实现`Preparable`接口来实现请求前的准备工作,或者使用`ValidationAware`接口来支持字段级别的验证。 - 动态领域模型(DDM)是Struts2的一个扩展特性,它允许在运行...

    struts拦截器介绍

    17. **PrepareInterceptor**:准备拦截器,如果Action实现了Preparable接口,它会调用Action的prepare方法进行预先处理。 18. **ScopeInterceptor**:范围拦截器,简化了将Action状态存储到session或application中...

    struts-default中拦截器介绍.pdf

    15. `prepare` 拦截器:如果Action实现了`Preparable`接口,它会调用`prepare()`方法,确保在Action执行前做一些预处理工作。 16. `static-params` 拦截器:将XML配置文件中`&lt;action&gt;`标签下的`&lt;param&gt;`标签内的...

    struts2拦截器详述ppt

    开发者可以通过配置文件(如`struts-default.xml`)来定制自己的拦截器和拦截器链。 下面列出了一些常见的Struts2内置拦截器及其功能: - **Alias Interceptor**:在不同请求之间转换请求参数的名字,保持请求内容...

    Java拦截器.pdf

    Java拦截器是面向切面编程(AOP)的一种实现方式,主要用于在方法执行前后插入额外的操作,例如日志记录、权限验证、性能监控等。在Web应用框架如Struts 2中,拦截器扮演着重要角色,它们可以动态地拦截Action调用,...

    Struts2内置拦截器简介

    Struts2的核心是拦截器(Interceptor)机制,通过一系列可配置的拦截器来处理请求和响应。Struts2提供了丰富的内置拦截器,这些拦截器可以单独使用,也可以组合使用,以满足不同的业务需求。接下来将详细介绍Struts2...

    struts 2.0源码2

    视频10、20和21深入讲解了Preparable拦截器、paramsPrepareParamsStack拦截器栈以及自定义拦截器的实现和应用,例如防止表单重复提交。 5. **类型转换**:Struts 2自动处理请求参数到Action属性的类型转换。视频11...

    struts2_工作流程

    理解Struts2的工作流程和拦截器机制对于开发高效的MVC应用至关重要,因为它允许开发者通过拦截器进行定制化处理,增强应用的功能和性能。通过合理的拦截器配置,开发者可以实现诸如日志记录、权限控制、异常处理、...

    struts2工作流程

    通过其内置的拦截器和自定义拦截器,可以扩展和定制各种功能,满足不同项目的需求。同时,它的模型驱动和类型转换机制简化了数据绑定和验证过程。了解和掌握Struts2的工作流程,对于开发高效、可维护的Java Web应用...

    struts2 笔记(根据尚硅谷视频所记)

    通过`&lt;param&gt;`标签,我们可以自定义拦截器的行为,比如`prepare.alwaysInvokePrepare`被设置为`false`,意味着只有当Action类中有`@Preparable`注解或者实现了`PrepareInterceptor`接口时,`PrepareInterceptor`才会...

    struts2框架源码

    4. **Interceptor的实现**:如Preparable接口用于在Action执行前做预处理,Validation拦截器用于数据验证,Exception拦截器用于异常处理等。 5. **动态方法调用**:Struts2支持动态方法调用,这意味着Action方法...

    深入浅出Struts2(附源码)

    第10章 Model Driven和Preparable拦截器 196 10.1 把动作与模型隔离开 196 10.2 Model Driven拦截器 197 10.3 Preparable拦截器 201 10.4 小结 206 第11章持久层 207 11.1 DAO模式 207 11.1.1 DAO模式的最...

    struts2小例子

    常见的拦截器有Params(参数注入),I18n(国际化),Validation(验证)和Exception(异常处理)。 4. **Result类型**:结果类型定义了Action执行后如何展示结果。它可以是JSP页面、重定向、转发或者其他自定义的...

    Struts2视频教程

    - **异常处理**:配置异常拦截器,实现全局异常捕获和处理,提升用户体验。 - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **...

    struts2解析文件

    - **Interceptor(拦截器)**: 拦截器是Struts2的一大特色,它们是实现了特定接口的类,可以插在Action调用之前和之后执行,用于执行如日志记录、权限检查等预处理或后处理任务。 **2. Struts2的生命周期** - 用户...

    Javaweb技术文档

    封捷_ModelDriven和Preparable拦截器 张晓飞_Tomcat的设计模式分析 张晓飞_Tomcat系统架构分析 张晓飞_UML模型图 张晓飞_WEB书城. 张晓飞_正则表达式学习手册 HTTP协议简介_封捷 JNDI原理_张晓飞 Servlet_封捷 Web...

Global site tag (gtag.js) - Google Analytics