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;
}
@Override
public 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 {

	@Override
public 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; @Override
public 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));
}//validate 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 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; //null
private 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 {

	@Override
public 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

	@Override
public 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中的token
System.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 {

	@Override
public 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); } @Override
public 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>

JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体的更多相关文章

  1. JavaWeb 之 重复提交表单和验证码相关的问题!

    下面我们首先来说一下表单的重复提交问题,我们知道在真实的网络环境中可能受网速带宽的原因会造成页面中表单在提交的过程中出现网络的延迟等问题,从而造成多次提交的问题!下面我们就具体来分析一下造成表单提交的 ...

  2. Struts2 token禁止重复提交表单

    如果服务器响应慢的情况下,用户会重复提交多个表单,这时候有两种设计思想: 1.在客户端使用JS技术,禁止客户重复提交表单.但是这样会使一些不使用浏览器方式登陆的人比如使用底层通信来攻击你的服务器 2. ...

  3. PHP防止用户重复提交表单

    我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 那么如何规避 ...

  4. struts2中token防止重复提交表单

    struts2中token防止重复提交表单 >>>>>>>>>>>>>>>>>>>&g ...

  5. 关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理

    Web页面中经常碰到这类问题,就是客户端多次点击一个按钮或者链接,导致程序出现不可预知的麻烦. 客户就是上帝,他们也不是有意要给你的系统造成破坏,这么做的原因很大一部分是因为网络慢,点击一个操作之后, ...

  6. php防止重复提交表单

    解决方案一:引入cookie机制来解决 提交页面代码如下a.php代码如下: <form id="form1" name="form1" method=& ...

  7. 用HTTP状态码实现提交表单后刷新页面不重复提交

    正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form act ...

  8. spring mvc 防止重复提交表单的两种方法,推荐第二种

    第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...

  9. JAVA后端生成Token(令牌),用于校验客户端,防止重复提交

    转:https://blog.csdn.net/u011821334/article/details/79390980 转:https://blog.csdn.net/joshua1830/artic ...

随机推荐

  1. 火狐 a 标签 download 属性,要在 a 标签添加到页面中才生效;

    在 chrome 中,如果需要设置点击下载文件,需要创建一个 a 标签,指定 download 属性和 href 属性即可, var aLink = document.createElement('a ...

  2. PHP使用SimpleElement创建和解析xml文件

    <!-- 使用SimpleXMLElement生成xml文件 --><?php//生成一个xml文件 //xml字符串$_xml = <<<_xml<?xml ...

  3. Eclipse打包java工程

    Eclipse打包java工程步骤如下: 1.选择预打包的工程->Export. 2.选择java->JAR file. 3.导出JAR文件设置. 这里有几个选项: Export gene ...

  4. 接口测试工具 — jmeter(关联)

    1.正则表达式 1)添加正则表达式提取器 2)提取关联词 3)填写正则表达式 4)使用关联,其他请求使用${sign2}代替变量值 2. 1)添加提取器 2)填写变量值 3)使用关联,其他请求使用${ ...

  5. linux7开机自启动东方通tongweb

    自启动服务: 可以通过把TongWeb设置为系统服务来实现. 具体实现: 以root用户进行操作,在/etc/init.d目录下编写TongWeb的服务脚本tongweb,用来控制TongWeb的启动 ...

  6. settings配置与model优化

    settings配置与model优化 settings: 项目基本配置(settings.py, models.py, admin.py,  templates...).数据库操作.中间件 http: ...

  7. x265探索与研究(六):main()函数

    x265探索与研究(六):main()函数 x265源代码的入口函数是main(),本文分析main()的主要功能. 首先给出main()函数的功能及其代码结构:其次给出main()函数源代码以及分析 ...

  8. node.js基本工作原理及流程

    概述 Node.js是什么 Node 是一个服务器端 JavaScript 解释器,用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非 ...

  9. mysql中变量的定义

    mysql中的变量定义 mysql的变量分为系统变量和用户变量,mysql系统定义的变量是系统变量,用户自己定义的变量为用户变量.对于系统变量,用户只能够改变它的值不能够创建新的系统变量.对于用户变量 ...

  10. python16_day14【jQuery】

    一.作用域 1.作用域例一 <script> var str = "global"; //AO1 AO1.str function t(age){ console.lo ...