JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

来源:互联网 发布:java仿qq登录界面 编辑:程序博客网 时间:2024/05/14 14:27

1. struts 工作流程图

超链接

 

2. 入门案例

struts入门案例:1、写一个注册页面,把请求交给 struts处理<form action="${pageContext.request.contextPath }/Register.do" method="post">   用户名:<input type="text" name="username"><br/>   密码:<input type="password" name="password"><br/>   邮箱:<input type="text" name="email"><br/>   <input type="submit" value="注册">   </form><html:errors property="username"/>2、导入struts开发包,并在web.xml文件配置struts(ActionServlet)处理所有.do请求  <servlet>  <servlet-name>ActionServlet</servlet-name>  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>   <init-param>      <param-name>config</param-name>      <param-value>/WEB-INF/struts-config.xml</param-value>     </init-param>    <load-on-startup>2</load-on-startup>    </servlet>    <servlet-mapping>  <servlet-name>ActionServlet</servlet-name>  <url-pattern>*.do</url-pattern>  </servlet-mapping>3、在web-inf目录中加入struts的配置文件:struts-config.xml,并配置struts收到请求后找RegisterAction处理,并配置在找RegisterAction处理请求之前,把数据封装到formbean中<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts-config PUBLIC          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"          "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config><form-beans><form-bean name="UserFormBean" type="cn.itcast.web.formbean.UserFormbean"></form-bean></form-beans><!-- 配置struts收到请求后找一个action处理 --><action-mappings><action path="/Register" type="cn.itcast.web.action.RegisterAction" name="UserFormBean"></action></action-mappings></struts-config>4、把封装数据formbean,以及处理请求的RegisterAction写出来

JavaBean 继承 ActionForm

public class UserFormbean extends ActionForm {private String username;private String password;private String email;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {ActionErrors errors = new ActionErrors();if(this.username==null || this.username.trim().equals("")){errors.add("username", new ActionMessage("errors.username.required"));}return errors;}}

Action:

public class RegisterAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {UserFormbean bean = (UserFormbean) form;System.out.println(bean.getUsername());System.out.println(bean.getPassword());System.out.println(bean.getEmail());try{System.out.println("向数据注册用户!!");request.setAttribute("message", "注册成功");}catch (Exception e) {request.setAttribute("message", "注册失败");}return mapping.findForward("message");//转发}}

web.xml 配置

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    <servlet>  <servlet-name>ActionServlet</servlet-name>  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>   <init-param>      <param-name>config</param-name>      <param-value>/WEB-INF/struts-config.xml</param-value>    </init-param>    <load-on-startup>2</load-on-startup>    </servlet>    <servlet-mapping>  <servlet-name>ActionServlet</servlet-name>  <url-pattern>*.do</url-pattern>  </servlet-mapping>      <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

struts-config.xml 配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config><form-beans><form-bean name="UserFormBean" type="com.kevin.domain.UserFormbean"></form-bean></form-beans><action-mappings><action path="/Register" type="com.kevin.action.RegisterAction" name="UserFormBean"input="/index.jsp"> //bean校验错误后 回跳<forward name="message" path="/message.jsp"></forward>   //转发</action></action-mappings>       <message-resources parameter="com.yourcompany.struts.ApplicationResources" />  //配置文件  国际化</struts-config>



----------------------- 实例 : 表单校验,防表单重复提交  表单数据封装到实体-----------------

首页

<body><html:link action="/RegisterUI" >注册</html:link>     </body>

/WEB-INF/jsp/register.jsp 表单页面

<%@page import="com.kevin.golobals.Preference"%><%@page import="com.kevin.golobals.Gender"%><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>        <title>注册页面</title>  </head>    <body>  <!--    html:form 发生session域中如果有org.apache.struts.action.TOKEN为随机数,它会自动生成隐藏字段    -->  <html:form action="/Register">  <table width="50%" frame="border">    <tr>  <td>用户名</td>  <td>  <html:text property="username"/>  </td>  <td>  <html:errors property="username"/>  </td>    </tr>    <tr>  <td>密码</td>  <td>  <html:password property="password" redisplay="false"/>  </td>    <td>  <html:errors property="password"/>  </td>  </tr>    <tr>  <td>确认密码</td>  <td>  <html:password property="password2"  redisplay="false"/>  </td>  <td>  <html:errors property="password2"/>  </td>  </tr>    <tr>  <td>性别</td>  <td>  <c:forEach var="g" items="<%= Gender.values() %>">  <html:radio property="gender" value="${g.name }">${g.value }</html:radio>  </c:forEach>  </td>  <td>  <html:errors property="gender"/>  </td>    </tr>      <tr>  <td>生日</td>  <td>  <html:text property="birthday"></html:text>  </td>  <td>  <html:errors property="birthday"/>  </td>  </tr>    <tr>  <td>收入</td>  <td>  <html:text property="income"></html:text>  </td>  <td>  <html:errors property="income"/>  </td>  </tr>    <tr>  <td>城市</td>  <td>  <html:select property="city">  <html:option value="beijing">北京</html:option>  <html:option value="guangzhou">广州</html:option>  <html:option value="shanghai">上海</html:option>  </html:select>  </td>  <td>    </td>  </tr>    <tr>  <td>爱好</td>  <td>        <c:forEach var="pre" items="<%=Preference.values() %>">  <html:multibox property="preference" value="${pre.name }"/>${pre.value}  </c:forEach>  </td>  <td>  <html:errors property="preference"/>  </td>      </tr>    <tr>  <td>邮箱</td>  <td>  <html:text property="email"></html:text>  </td>  <td>  <html:errors property="email"/>  </td>  </tr>    <tr>  <td>  <input type="reset" value="清空">  </td>  <td>  <input type="submit" value="注册">  </td>  </tr>      </table>  </html:form>  </body></html>

com.kevin.domain , 表单数据bean 数据校验

public class UserFormBean extends ActionForm {private String username;private String password;private String password2; private String gender;private String birthday;private String income;private String city;private String[] preference;private String email;@Overridepublic ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {ActionErrors errors = new ActionErrors();if(isEmpty(this.username))addMessage(errors, "username", "用户名不能为空");else{if(!this.username.matches("^[A-Za-z]{3,9}"))addMessage(errors, "username", "用户名必须是3-9位字母");}//密码不能为空,要是3-9的字母或数字if(isEmpty(this.password)){addMessage(errors, "password", "密码不能为空");}else{if(!this.password.matches("\\w{3,9}")){addMessage(errors,"password", "密码必须是3-8位字母或数字");}}//二次密码不能为空,并且要和一次密码一致if(isEmpty(this.password2)){addMessage(errors, "password2", "密码不能为空");}else{if(!this.password2.equals(this.password)){addMessage(errors,"password2", "两次密码必须要一致");}}//性别不能为空,并且要是枚举的一个实例的值if(isEmpty(this.gender)){addMessage(errors, "gender", "性别不能为空");}else{try{Gender.valueOf(this.gender.toUpperCase());}catch (Exception e) {addMessage(errors, "gender", "性别非法");}}//生日可以为空,不为空时,要是一个日期if(!isEmpty(this.birthday)){try{DateLocaleConverter conver = new DateLocaleConverter(Locale.CHINA, "yy-M-d");conver.convert(this.birthday);}catch (Exception e) {addMessage(errors, "birthday", "生日不能一个合法的日期");}}//收入要是一个数字,可以为空if(!isEmpty(this.income)){try{Double.parseDouble(this.income);}catch (Exception e) {addMessage(errors, "income", "收入要是一个数字");}}//爱好可以为空,不为空时要是合法的枚举值:String[] preference;if(this.preference!=null && this.preference.length>0){for(String pre : this.preference){try{Preference.valueOf(pre.toUpperCase());}catch (Exception e) {addMessage(errors, "preference", "爱好输入有误");}}}//邮箱可以为空,不为空时,要是一个格式有效的邮箱if(!isEmpty(this.email)){if(!this.email.matches("\\w+@\\w+(\\.\\w+)+")){addMessage(errors, "email", "邮箱格式非法");}}return errors;}private boolean isEmpty(String value){if(value==null || value.trim().equals("")){return true;}return false;}private void addMessage(ActionErrors errors,String key,String message){errors.add(key,new ActionMessage(message,false));}//validatepublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPassword2() {return password2;}public void setPassword2(String password2) {this.password2 = password2;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public String getIncome() {return income;}public void setIncome(String income) {this.income = income;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String[] getPreference() {return preference;}public void setPreference(String[] preference) {this.preference = preference;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}

实体数据bean

public class User {private String id;private String username;private String password;private Gender gender;private Date birthday;  //nullprivate double income;private String city;private Preference[] preference;private String email;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public double getIncome() {return income;}public void setIncome(double income) {this.income = income;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public Preference[] getPreference() {return preference;}public void setPreference(Preference[] preference) {this.preference = preference;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}

com.kevin.action Action

public class RegisterUIAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {saveToken(request); //org.apache.struts.action.TOKEN 防表单重复提交return mapping.findForward("register");}}
public class RegisterAction extends Action { //表单处理 注册 Action@Overridepublic ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {//将表单数据封装到实体中  User user = new User();  UserFormBean formbean = (UserFormBean) form;  BeanUtils.copyProperties(user, formbean);  System.out.println(user.getUsername());try{if(isTokenValid(request)){resetToken(request);  //清楚session中的tokenSystem.out.println("处理用户注册请求.....");request.setAttribute("message", "注册成功");}else{System.out.println("对不起,您是重复提交");}}catch (Exception e){e.printStackTrace();request.setAttribute("message", "注册失败");}//return mapping.findForward("message");return null;}}

监听器,注册beanutils 转换器

public class WebInitListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent arg0) {//注册转换日期的转换器ConvertUtils.register(new Converter(){public Object convert(Class type, Object value) {if(value==null){return null;}if(value instanceof String){String d = (String)value;if(d.trim().equals("")){return null;}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {return sdf.parse(d);} catch (ParseException e) {throw new RuntimeException(e);}}throw new RuntimeException("输入类的类型不是String");}}, Date.class);//转性别枚举ConvertUtils.register(new Converter(){public Object convert(Class type, Object value) {if(value==null){return null;}return Gender.valueOf(((String) value).toUpperCase());}}, Gender.class);//转爱好枚举数组ConvertUtils.register(new Converter(){public Object convert(Class type, Object value) {if(value==null){return null;}String pres[] = (String[]) value;Preference p[] = new Preference[pres.length];for(int i=0;i<pres.length;i++){p[i] = Preference.valueOf(pres[i].toUpperCase());}return p;}},Preference[].class);}@Overridepublic void contextDestroyed(ServletContextEvent arg0) {}}

com.kevin.golobals 枚举类

public enum Gender {MALE("male","男"),FEMALE("female","女");private String name;private String value;private Gender(String name,String value){this.name= name;this.value = value;}public String getName() {return name;}public String getValue() {return value;}}
public enum Preference {SING("sing","唱歌"),DANCE("dance","跳舞"),FOOTBALL("football","足球");private String name;private String value;private Preference(String name, String value){this.name = name;this.value = value;}public String getName() {return name;}public String getValue() {return value;}}

struts-config.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config>  <form-beans >  <form-bean name="UserFormBean" type="com.kevin.domain.UserFormBean"></form-bean>  </form-beans>    <global-exceptions />  <global-forwards />      <action-mappings>  <action path="/RegisterUI"  type="com.kevin.action.RegisterUIAction" >  <forward name="register" path="/WEB-INF/jsp/register.jsp"></forward>  </action>    <action path="/Register"  type="com.kevin.action.RegisterAction"  name="UserFormBean"  scope="request"  validate="true"  input="/WEB-INF/jsp/register.jsp"  >  <forward name="message" path="/message.jsp"></forward>  </action>        </action-mappings>    <message-resources parameter="com.yourcompany.struts.ApplicationResources" /></struts-config>


web.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  <display-name />  <servlet>    <servlet-name>action</servlet-name>    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>    <init-param>      <param-name>config</param-name>      <param-value>/WEB-INF/struts-config.xml</param-value>    </init-param>    <init-param>      <param-name>debug</param-name>      <param-value>3</param-value>    </init-param>    <init-param>      <param-name>detail</param-name>      <param-value>3</param-value>    </init-param>    <load-on-startup>0</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>action</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>       <filter>      <filter-name>EncodingFilter</filter-name>      <filter-class>com.kevin.web.filter.EncodingFilter</filter-class>      <init-param>          <param-name>charset</param-name>          <param-value>UTF-8</param-value>      </init-param>    </filter>        <filter-mapping>      <filter-name>EncodingFilter</filter-name>      <url-pattern>/*</url-pattern>      </filter-mapping>        <listener>   <listener-class>com.kevin.web.listener.WebInitListener</listener-class>  </listener>     </web-app>







 




 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我该怎么办图片带字 学化妆找不到模特练妆怎么办? cf进房间闪退怎么办 手游cf账号封了怎么办 大门牙缺了一块怎么办 缺了一颗牙齿怎么办 CF购买医疗包竞猜币没到账怎么办 CF手游昵称不合法怎么办 微信gif尺寸过大怎么办 微信表情上限300怎么办 太受欢迎了怎么办快穿 兔宝宝沾上人气味怎么办 我该怎么办的文字图片 爱奇艺缓存视频显示下载失败怎么办 把老公惹生气了怎么办 苹果x用电量太快怎么办 小中考地生没过怎么办 如果遇到不负责的语文老师怎么办 孩子的语文老师教的不好怎么办 刚买的小猫很凶怎么办 2月幼犬不吃东西怎么办 小狗狗不吃狗粮怎么办 母猫不会照顾小猫怎么办 刚买的小狗拉稀怎么办 母兔子吃小兔子怎么办 照片照出来背亮景人是黑的怎么办 手机透明壳变黄了怎么办 ae视频渲染太慢怎么办 3ce口红太干了怎么办 中考误用0.38mm的笔怎么办 ps画笔都锁住了怎么办 削铅笔机坏了怎么办 幼儿园小朋友不听老师话怎么办 孩子在幼儿园不听老师话怎么办 幼儿园大班孩子上课不好好上怎么办 脸上挠了血印子怎么办 大班公开课烫伤了怎么办教案 孩子心理出现了问题该怎么办 幼师打孩子很多家长告怎么办 课堂上纪律不好的学生怎么办 孩子上幼儿园总感冒怎么办