Struts2笔记3

1.Action接受请求参数

  在action中定义属性,并添加set方法,当从页面中传过来的参数中有名称一样的参数时会自动给action中的属性赋值,添加get方法就可以从在页面中得到action的属性值。get或者post方法都可以。如下:

package cn.itcast.action;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class helloworld {
    private String msg;
    
    public String getMessage() {
        return msg;
    }

    public void setMessage(String message) {
        this.msg = message;
    }

    public String execute() throws Exception{
        return "SUCCESS";
    }

}
 <form action="<%=request.getContextPath()%>/test/list.do" method="get">
    message:<input type="text" name="message"/>
    <input type="submit" value="发送"/>
<%@ page language="java" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${message }
</body>
</html>

还可以定义一个对象用来接收所有参数,如Person,参数名如person.id

package cn.itcast.action;


import javax.xml.registry.infomodel.PersonName;

public class helloworld {
    private Person person;
    
    public Person getPerson() {
        return person;
    }

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

    public String execute() throws Exception{
        return "SUCCESS";
    }

}
package cn.itcast.action;

public class Person {
    private String id;
    private String name;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}
<form action="<%=request.getContextPath()%>/test/list.do" method="get">
    id:<input type="text" name="person.id"/><br/>
    name:<input type="text" name="person.name"/><br/>
    <input type="submit" value="发送"/>
</form>
<%@ page language="java" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${person.id }
${person.name }
</body>
</html>

默认Person对象为空的时候,会调用默认的构造函数新建对象,所以要提供默认的构造函数。(内部通过反射技术实现)。

注:Struts2.1.6会出现请求参数乱码问题

2.如果属性定义为Date类型,在地址路径中写http://localhost:8080/struts2/test/list.action?birthday=2013-01-14在页面中显示出的值为Mon Jan 14 00:00:00 CST 2013,但是如果传递的参数是20130114,就会报错,因为给action的属性赋值的时候会去找setBirthday参数为String类型的方法,找不到会报错。所以就要进行类型转换。

  struts2有两种类型转换,局部和全局,局部只对某个action起作用,全局是对所有action中的类都起作用。

  步骤如下:

  1)新建一个转换器类重写DefaultTypeContronter中的convertValue方法,可以进行双向转换

package cn.itcast.type.converter;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class DateConverter extends DefaultTypeConverter {

    @Override
    public Object convertValue(Map<String, Object> context, Object value,Class toType) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
        try{
            if(toType==Date.class){
                String[] params = (String[])value;
                return dateFormat.parse(params[0]);
            }else if(toType==String.class){
                Date date  = (Date)value;
                return dateFormat.format(date);
            }
        
        }catch (Exception e) {}
            return null;
    }
        
}

  2)在需要进行类型转换的Action的包下新建:Action名称-conversion.properties,如:helloworld-conversion.properties,在文件中写:属性名=类转换器的完成包名加类名

birthday=cn.itcast.type.converter.DateConverter

  3)将局部类型转换器改成全局类型转换器,将properties文件名称改为xwork--conversion.properties,放在src下,文件内容改为:类型的类名=类转换器的完成包名加类名

java.util.Date=cn.itcast.type.converter.DateConverter

   PS:这时类型转换器将多所有Date类型的数据进行转换,这时参数的格式只能是“19990909”这种形式,不能是“1999-9-9”

3.往application/session/request范围放入属性

     ActionContext ctx = ActionContext.getContext();
        ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app
        ctx.getSession().put("ses", "session范围");//往session里放入ses
        ctx.put("req", "request范围");//往request里放入req

  得到application/session/request对象,并放入值

     HttpServletRequest request = ServletActionContext.getRequest();
        ServletContext servletContext = ServletActionContext.getServletContext();
        request.getSession();
        
        request.setAttribute("req", "request范围2");
        request.getSession().setAttribute("ses", "session范围2");
        servletContext.setAttribute("app", "应用范围2");

  在页面显示:

${applicationScope.app }<br/>
${sessionScope.ses }<br/>
${requestScope.req }<br/>

 4.文件上传

  1)在WEB-INF/lib目录下加入commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar这两个jar包(commons-fileupload-1.2.1.jar这个在之前用struts的时候已经加入了,commons-io-1.3.2.jar是因为要使用FileUtils这个类)

  2)设置form表单

  <form enctype="multipart/form-data" action="${pageContext.request.contextPath }/test/fileUp.action" method="post">
        <input type="file" name="image">
        <input type="submit" value="上传"/>
    </form>

  3)写Action类

package cn.itcast.action;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;

public class FileUp {
    private File image;
    private String imageFileName;
    
    public File getImage() {
        return image;
    }

    public void setImage(File image) {
        this.image = image;
    }

    public String getImageFileName() {
        return imageFileName;
    }

    public void setImageFileName(String imageFileName) {
        this.imageFileName = imageFileName;
    }

    public String execute() throws IOException{
        String realPath = ServletActionContext.getServletContext().getRealPath("/images");
        System.out.println(realPath);
        if(image!=null){
            File savaFile = new File(new File(realPath),imageFileName);
            if(!savaFile.getParentFile().exists()){
                savaFile.getParentFile().mkdirs();
            }
            FileUtils.copyFile(image, savaFile);
            ActionContext.getContext().put("message", "上传成功");
        }
        return "success";
    }
}

  4)struts的配置

    <action name="fileUp" class="cn.itcast.action.FileUp" method="execute">
            <result name="success">/WEB-INF/pages/helloworld.jsp</result>
        </action>

  5)访问form表单的页面,上传成功后会自动跳转到helloworld.jsp

  6)默认的文件最大为2097152,如果超过,就要在struts.xml中设定常数

<constant name="struts.multipart.maxSize" value="12701096"></constant>

  PS:这个不能无限大,用网页上传,太大的话会失败

5.多文件上传

  1)将form改成多个input

<form enctype="multipart/form-data" action="${pageContext.request.contextPath }/test/fileUp.action" method="post">
        <input type="file" name="image"><br/>
        <input type="file" name="image"><br/>
        <input type="file" name="image"><br/>
        <input type="submit" value="上传"/>
    </form>

2)修改Action的属性及保存文件的代码

package cn.itcast.action;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;

public class FileUp {
    private File[] image;
    private String[] imageFileName;
    
    

    public File[] getImage() {
        return image;
    }



    public void setImage(File[] image) {
        this.image = image;
    }



    public String[] getImageFileName() {
        return imageFileName;
    }



    public void setImageFileName(String[] imageFileName) {
        this.imageFileName = imageFileName;
    }



    public String execute() throws IOException{
        String realPath = ServletActionContext.getServletContext().getRealPath("/images");
        System.out.println(realPath);
        if(image!=null){
            File realPathFile = new File(realPath);
            if(!realPathFile.exists()){
                realPathFile.mkdirs();
            }
            for(int i=0;i<image.length;i++){
                File savaFile = new File(realPathFile,imageFileName[i]);
                FileUtils.copyFile(image[i], savaFile);
            }
            
            ActionContext.getContext().put("message", "上传成功");
        }
        return "success";
    }
}
原文地址:https://www.cnblogs.com/fanglove/p/2860095.html