一,web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 404页面,全局 --><!-- <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> --> </web-app>
二,action
PointAction
package com.direct.action; import java.util.Date; import com.direct.model.Point; import com.opensymphony.xwork2.ActionSupport; public class PointAction extends ActionSupport{ public String getpoint(){ // 使用配置文件连接两个类,实现相应的类型转换 System.out.println(point); System.out.println(birthday); System.out.println(salary); System.out.println("数据类型uname:"+uname.getClass().getName()); return "point"; } private String uname; private Point point; private Date birthday; private double salary; public String getUname() { return uname; } public void setUname(String name) { this.uname = name; } public Point getPoint() { return point; } public void setPoint(Point point) { this.point = point; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
CarAction
package com.direct.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.direct.model.Car; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class CarAction extends ActionSupport{ private Car car; public String getcar(){ // System.out.println(car.getCarid()+"---"+car.getCarname()+"---"+car.getCarsize()+"----"+car.getPrice()); ActionContext.getContext().put("car", car);// 一次请求 ActionContext.getContext().getSession().put("id", 2);//一次会话 ActionContext.getContext().getApplication().put("name", "小白");//application // 原生态 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("address", "重庆"); HttpSession session = request.getSession(); session.setAttribute("sex", "女"); ServletContext application = ServletActionContext.getServletContext(); application.setAttribute("hobby", "sleep"); return "getcar"; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } }
GoodsAction
package com.direct.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class GoodsAction extends ActionSupport{ private String goodsname; private String goodsprice; public String addgoods(){ ActionContext.getContext().put("goodsname", goodsname); ActionContext.getContext().put("goodsprce", goodsprice); System.out.println(goodsname+"----"+goodsprice); return "addgoods"; } public String getGoodsname() { return goodsname; } public void setGoodsname(String goodsname) { this.goodsname = goodsname; } public String getGoodsprice() { return goodsprice; } public void setGoodsprice(String goodsprice) { this.goodsprice = goodsprice; } }
FileupAction 文件上传与下载
package com.direct.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class FileupAction extends ActionSupport{ private File[] upload;//上传的文件 private String[] uploadFileName;//文件名 private String[] uploadContentType;//文件类型 private String filename; //多个文件上传 public String upload() throws IOException{ String path = ServletActionContext.getServletContext().getRealPath("/"); File file = new File(path+"upfile/"); if (! file.exists() && !( file.isDirectory())) { file.mkdir(); } // 循环上传多个文件 for (int i = 0; i < uploadFileName.length; i++) { // 输出流,放在服务器的目录下 FileOutputStream fos = new FileOutputStream(file+"/"+uploadFileName[i]); // 输入流 FileInputStream fis = new FileInputStream(upload[i]); byte[] bt = new byte[1024]; int len = 0; while((len=fis.read(bt))>0){ fos.write(bt,0,len); } } showlist(); return "upload"; } // 下载文件,在xml中配置 public InputStream getTfile(){ return ServletActionContext.getServletContext().getResourceAsStream("upfile/"+filename); } public String showlist(){ String path = ServletActionContext.getServletContext().getRealPath("/"); File file = new File(path+"upfile/"); File[] files = file.listFiles(); ArrayList<String> listfile = new ArrayList<String>(); for (File f : files) { listfile.add(f.getName());// 存入文件名 } ActionContext.getContext().put("listfile", listfile); return "listfile"; } // 限制上传文件类型 public void validateUpload(){ for (int i = 0; i < uploadFileName.length; i++) { if ("text/plain".equals(uploadContentType[i])) { addFieldError("fileerror", "上传文件类型不支持"); } } } public File[] getUpload() { return upload; } public void setUpload(File[] upload) { this.upload = upload; } public String[] getUploadFileName() { return uploadFileName; } public void setUploadFileName(String[] uploadFileName) { this.uploadFileName = uploadFileName; } public String[] getUploadContentType() { return uploadContentType; } public void setUploadContentType(String[] uploadContentType) { this.uploadContentType = uploadContentType; } public String getFilename() { return filename; } public void setFilename(String filename) { try { filename = new String(filename.getBytes("iso-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } this.filename = filename; } }
三,interceptor
package com.direct.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class Myinterceptor extends AbstractInterceptor{ /* *继承AbstrctInterceptor 的拦截器会拦截所有的action类 *继承MethodFilterInterceptor 只会拦截需要拦截的方法 * 拦截类(non-Javadoc) * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) */ @Override public String intercept(ActionInvocation arg0) throws Exception { String actionName = arg0.getProxy().getActionName(); String method = arg0.getProxy().getMethod(); System.out.println("拦截器的:"+actionName+"---->"+method); String invoke = arg0.invoke(); return invoke; } }
四,converter
从页面获取字符串,由逗号隔开。把这个有两个数字的字符串类型转换为 点对象‘
package com.direct.converter;
import java.util.Map;
import com.direct.model.Point;
import ognl.DefaultTypeConverter;
public class PointConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (toType==Point.class) {
String[] param = (String[])value;
String[] split = param[0].split(",");
int int1 = Integer.parseInt(split[0]);
int int2 = Integer.parseInt(split[1]);
Point point = new Point(int1, int2);
return point;
}
return null;
}
}
PointAction-conversion.properties 转换的配置文件,放在与action同级目录下
取名与转换的action名一致
point=com.direct.converter.PointConverter
五,jsp
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <br/> <hr/> <form action="${pageContext.request.contextPath }/goods_addgoods.action" method="post"> <s:token></s:token> 商品名称:<input type="text" name="goodsname" value=""/><br/> 商品价格:<input type="text" name="goodsprice" value=""/> <input type="submit" value="提交"> </form> <hr/> <form action="${pageContext.request.contextPath }/point_getpoint.action" method="post"> 姓名:<input type="text" name="uname" /><br/> 生日:<input type="text" name="birthday"/><br/> 月薪:<input type="text" name="salary"/><br/> <hr/> 一个点的坐标:<input type="text" name="point"/><br/> <input type="submit" value="提交"> </form> </body> </html>
fileup.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'fileup.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 上传的文件:<br/> <form action="${pageContext.request.contextPath }/upfile_upload.action" enctype="multipart/form-data" method="post"> 文件一:<input type="file" name="upload" /><br/> 文件二:<input type="file" name="upload" /><br/> 文件三:<input type="file" name="upload" /><br/> <input type="submit" value="提交"/> </form> <s:fielderror></s:fielderror> <s:fielderror fieldName="fileerror"></s:fielderror> <a href="${pageContext.request.contextPath }/upfile_showlist.action">前往下载</a> </body> </html>
downfile.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'downfile.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 显示下载的文件名:<br/> <c:forEach items="${listfile}" var="item"> <a href="${pageContext.request.contextPath }/filedownload.action?filename=${item}" >${item }</a><br/> </c:forEach> <hr/> </body> </html>
main.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'main.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <br/> <form action="${pageContext.request.contextPath }/car_getcar.action" method="post"> 车编号:<input type="text" name="car.carid" value=""/><br/> 车名称:<input type="text" name="car.carname" value=""/><br/> 车型号:<input type="text" name="car.carsize" value=""/><br/> 价格:<input type="text" name="car.price" value=""/><br/> <input type="submit" value="提交"/> </form> </body> </html>
userinfo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'userinfo.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> userinfo.jsp <br/> 汽车信息:${car.carid }/${car.carname }/${car.carsize }/${car.price }<br/> 人员信息:${id }/${name }/${sex }/${address }/${hobby } <hr/> 商品信息:<br/> 商品名称:${goodsname }<br/> 商品价格:${goodsprice } </body> </html>
六,struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.i18n.encoding" value="utf-8"></constant> <package name="pk" namespace="/" extends="struts-default"> <!-- 自定义拦截器 --> <interceptors> <interceptor name="myinterceptor" class="com.direct.interceptor.Myinterceptor"> <param name="includeMethods">selete_*,add_*</param><!-- 需要拦截的方法 --> <param name="excludeMethods">query_*</param><!-- 不需要拦截的方法 --> </interceptor> <interceptor-stack name="mystack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="myinterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 全局异常处理,在局部找不到在找全局 --> <!--<global-results> <result name="gex">/exception.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="gex" exception="java.lang.Exception"></exception-mapping> </global-exception-mappings> --> <action name="user_*" method="{1}" class="com.direct.action.UserAction" > <!-- UserAction类,局部异常处理,必须放在action前面 --> <result name="ex">/exception.jsp</result> <exception-mapping result="ex" exception="java.lang.Exception"></exception-mapping> <result name="success">/main.jsp</result> <!-- 返回值为success,跳转页面 --> <result name="query" type="dispatcher">/userinfo.jsp</result> <!-- 默认是dispatcher --> <result name="three" type="redirect">http://www.baidu.com</result> <result name="one" type="redirect">user_select.action?userid=20&usersex=nv</result> <result name="two" type="redirectAction"> <param name="actionName">/user_two.action</param> <param name="username">张三</param> </result> <result name="twouser" type="chain">user_login</result><!-- 只能chain跳转到方法 --> <result name="select" type="dispatcher"> <param name="location">/main.jsp</param> </result> <!-- plainText 输出页面源码 --> <result name="text" type="plainText">/main.jsp</result> </action> <action name="car_*" class="com.direct.action.CarAction" method="{1}"> <result name="getcar">/userinfo.jsp</result> </action> <action name="goods_*" class="com.direct.action.GoodsAction" method="{1}"> <!-- token拦截,当表单提交后,再次没刷新页面重新提交不会进入action,就跳入错误提示页面invalid.token --> <interceptor-ref name="token"> <param name="includeMethods">add*</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="addgoods">/userinfo.jsp</result> <result name="invalid.token">/error.jsp</result> </action> <action name="point_*" class="com.direct.action.PointAction" method="{1}"> <result name="point">/userinfo.jsp</result> </action> <action name="upfile_*" class="com.direct.action.FileupAction" method="{1}"> <interceptor-ref name="fileUpload"><!-- 自带的文件过滤器 --> <param name="allowedType">jpg,png,excel</param><!-- 允许上传的文件类型 --> <param name="maximumSize">5000</param><!-- 文件大小 --> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="upload">/downfile.jsp</result> <result name="input">/fileup.jsp</result> <result name="listfile" >/downfile.jsp</result> </action> <!-- 文件下载配置 --> <action name="filedownload" class="com.direct.action.FileupAction"> <result name="success" type="stream"> <param name="inputName">tfile</param> <param name="contentDisposition">attachment;fileName="${filename}"</param> <param name="bufferSize">4096</param> </result> </action> </package> </struts>
七,两个实体类 Car 和 Point
必须有get 和 set 方法 ,action就是先执行对象的get , set 方法进行传值。我在这简写了
package com.direct.model;
public class Car {
private int carid;
private String carname;
private String carsize;
private String price;
}
package com.direct.model;
public class Point {
private int x;
private int y;
}