ITPub博客

首页 > IT职业 > IT职场 > Struts2【开发Action】知识要点

Struts2【开发Action】知识要点

IT职场 作者:ybbyic 时间:2021-09-09 09:10:50 0 删除 编辑

tags: Struts2


http://blog.csdn.net/hon_3y/article/details/66975268

可以使用FileUpload或者SmartUpload组件来完成文件上传的功能。但是呢,FileUpload组件使用起来是比较麻烦的...而SmartUPload解决中文的问题也非常麻烦

下载
  • Action代码:

    /**
     * 访问Action的业务方法仅仅返回的是字符串。因此Struts在result节点提供了stream类型的type,
     * 指定了stream就代表着我这是要下载的...
     * 

* 既然要下载文件,那么肯定需要几样东西: * 1、文件名 * 2、代表文件的流 */ public String downLoad() { return "downLoad"; } //得到要下载的文件名,Struts提供了自动封装的功能 private String fileName; //如果文件名是中文的,那么需要手动转换,因为超链接是get方法提交 public void setFileName(String fileName) throws UnsupportedEncodingException { fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8"); this.fileName = fileName; System.out.println(fileName); } //得到代表下载文件流,该方法由Struts调用 public InputStream getAttrInputStream() { return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName); } //下载时,显示的名称【如果是中文,可能会乱码,因此要URLencode】---->在Struts.xml文件中通过${}可获取 public String getDownFileName() throws UnsupportedEncodingException { fileName = URLEncoder.encode(fileName, "UTF-8"); return fileName; }

  • Struts.xml
        /list.jsp<!--运行下载的类型,指定为所有的二进制文件-->application/octet-stream

                <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 -->
                attrInputStream

                <!-- 下载头,包括:浏览器显示的文件名 -->               <!--${}这里不是EL表达式-->
                attachment;filename=${downFileName}

                <!-- 缓冲区大小设置 -->
                1024

            

效果

图片描述


模型驱动
什么是模型驱动

在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装.

为什么要使用模型驱动?

我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的...既然有了params拦截器,为啥还要模型驱动??

当我们使用params拦截器完成数据自动封装的时候,如果要封装的是JavaBean对象,那么在web表单中就必须的name写上javaBean.属性名....

这样的话,web层和Action层就耦合了...因为在web层必须要知道封装的JavaBean对象是什么才能够实现自动封装!

而模型驱动就解决了这个问题!即时不知道Action层的JavaBean对象是什么,也能够完成数据自动封装!

模型驱动的实现原理

实现模型驱动功能也是由拦截器完成的,我们来看看拦截器到底做了什么吧....


         

拦截方法的源码是这样的:


    public String intercept(ActionInvocation invocation) throws Exception {

        //得到当前要执行的Action对象
        Object action = invocation.getAction();

        //判断该Action对象是否实现了ModelDriven接口
        if(action instanceof ModelDriven) {
            ModelDriven modelDriven = (ModelDriven)action;

            //获取值栈对象
            ValueStack stack = invocation.getStack();

            //得到model的对象
            Object model = modelDriven.getModel();

            //把对象存到值栈对象中
            if(model != null) {
                stack.push(model);
            }
            if(this.refreshModelBeforeResult) {
                invocation.addPreResultListener(new ModelDrivenInterceptor.RefreshModelBeforeResult(modelDriven, model));
            }
        }

        return invocation.invoke();
    }

把model对象放到值栈对象之后,Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中.

也就是说,使用模型驱动是需要配合Params拦截器完成的!

使用数据模型驱动
实现ModelDriven接口
  • 实现ModelDriven接口,重写方法....实现接口时,要封装的对象是什么,形参类型就给什么

public class UserAction extends ActionSupport implements ModelDriven {

    public String login() {

        return SUCCESS;
    }

    @Override
    public User getModel() {
        return null;
    }
}
对象实例化

public class UserAction extends ActionSupport implements ModelDriven {

    //这里一定要实例化
    User user = new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public User getModel() {
        return user;
    }
}
测试

JSP提交页面,直接写上JavaBean对象的属性就行了..不需要写上JavaBean对象的名称!

用户名:
密码:
电话:
邮箱:
  • 在Action业务方法中输出User对象的数据

    @Override
    public String execute() throws Exception {

        System.out.println(user);
        return SUCCESS;
    }

图片描述


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1769/viewspace-2800006/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-15

  • 博文量
    88
  • 访问量
    1013