`

Struts第一天

阅读更多
今天所讲的知识点
A 框架简介
B Struts简介
C Struts的工作原理
D 关于ActionForm的参数接收
E Structs的Bean标签


我对知识点的分析
A 框架
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
什么要用框架?
      因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。
      框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。
      软件为什么要分层?
      为了实现“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源…
为什么要进行框架开发?
      框架的最大好处就是重用。面向对象系统获得的最大的复用方式就是框架,一个大的应用系统往往可能由多层互相协作的框架组成。


B Struts简介
Struts框架:针对JSP/Servlet部分代码进行封装,是一个MVC设计模式的具体实现。
JSP/Servlet:
JSP  Servlet(参数接收比较复杂,跳转路径编写到了Java(Servlet)代码中,修改和维护比较麻烦) JSP(列表显示代码相对复杂,比较乱)
JSP/Servlet模式中进行表单验证:
使用JavaScript(不安全)或在Servlet中进行验证(代码比较复杂,如果需要回填数据,还需要单独编写代码进行设置)


Struts的流程:
JSP  ActionServlet(处理跳转路径)  找到Struts的核心配置文件(找所要提交的类)  ActionForm(接收参数,进行验证)  通过后再进入Action(处理具体的数据库调用等操作,进行跳转),没通过就返回错误页,自动处理数据回填

Struts简介概述

Struts的简单使用
示例:使用Struts框架实现登陆
一、建立项目
与之前一样
二、加入Struts框架支持
在项目上点鼠标右键  MyEclipse  add Struts Cap…


注意支持的版本为Struts1.2
修改基础包名,资源文件的默认包名
ActionServlet的名称及其URL路径(一般为*.do)

三、查看加入了Struts后的变化
加入了Struts后的项目文件的变化:

1、 加入了支持Struts框架的jar包
2、 在WEB-INF下加入了struts-config.xml核心配置文件
3、 在WEB-INF下加入了Struts的支持标签(.tld)。
4、 在WEB-INF下加入了validator-rules.xml,用来保存自动验证时的验证规则。
5、 在src下Struts定义的默认包中包含了资源文件
6、 在web.xml中加入了ActionServlet的配置

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <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>
</web-app>


四、建立相应的页面
此处建立一个加入了Struts1.2支持的jsp页面,页面中默认包含一个表单

默认代码如下:
<%@ page language="java" pageEncoding="GBK"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
  <head>
    <html:base />
   
    <title>MyJsp.jsp</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>
    <html:form action="" method="post" focus="login">
      <table border="0">
        <tr>
          <td>Login:</td>
          <td><html:text property="login" /></td>
        </tr>
        <tr>
          <td>Password:</td>
          <td><html:password property="password" /></td>
        </tr>
        <tr>
          <td colspan="2" align="center"><html:submit /></td>
        </tr>
      </table>
    </html:form>
  </body>
</html:html>

代码解释:
(1)在建立好的jsp中,默认导入了Struts1.2的标签库,并且不再默认导入java.util包了
<%@ page language="java" pageEncoding="GBK"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
uri:表示标签的唯一标识,在tld标签文件中定义
prefix:前缀,表示在页面上使用标签时所需要输入的前缀信息
(2)页面中的标签:
<html:xxx>,该html标签为UI标签,用来处理用户界面(页面输入表单等信息),使用了<html:>标签后的优点为自动回填,显示功能和HTML中的标记一样
(3)表单提交路径设置为:
<html:form action="login.do" method="post" focus="login">
*.do是ActionServlet的访问路径
如果表单对应的提交路径不存在,则打开该页面时自动提示错误。
javax.servlet.ServletException: Cannot retrieve mapping for action /login

五、建立Struts的Action与ActionForm
1、建立Struts的Action与ActionForm
(1)在项目的src上单击右键,new  Other MyEclipse  Web-Struts  Struts 1.2  Struts 1.2 Form, Action & JSP


(2)单击Next,进入ActionForm类的设置,该类的名称,并增加要从页面中接受的参数及参数的数据类型。

输入 Use case,一般为提交路径.do前的名称
需要在Form Properties中加入所有提交的属性名称,加入后,ActionForm会通过反射自动接收属性。
(3)点击Next,进入Action类的设置:

Path路径表示表单提交到该Action中的路径
InputSource:表示验证出错后,跳转的路径。
Attribute:ActionServlet在解析struts-config.xml时,通过该属性,找到相应的ActionForm的信息,然后通过反射生成其对象

(4)点击Finish后,在struts-config.xml中自动加入了Action与ActionForm的配置。
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />

  <form-beans >
    <form-bean name="loginForm" type="mldn.lin.struts.form.LoginForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="loginForm"
      input="/index.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      type="mldn.lin.struts.action.LoginAction" />
  </action-mappings>

  <message-resources parameter="mldn.lin.struts.ApplicationResources" />
</struts-config>
Struts所有配置的路径都必须是绝对路径(加/)
data-sources:可以在里面配置一些数据库连接或数据源操作,但使用struts开发时不会用到。
form-beans:配置所有的ActionForm
|- form-bean:配置一个ActionForm
|- name:用来和Action配置进行关联,注意不能重复
|- type:包.类名,用来通过反射创建ActionForm
globl-exceptions:处理Struts执行过程中的异常的(处理公共的各种异常,当出现该异常时,自动跳转到设置好的错误页,并根据key值显示错误信息)
例如:
<global-exceptions>
<exception key="numberformat" type="java.lang.NubmerFormatException"></exception>
</global-exceptions>
global-forwards:配置全局跳转路径,假设所有的Action都有一个公共的跳转路径,可以将该路径配置到这里,这样可以不需要在action中重复配置该路径
例如:
<global-forwards >
<forward name="global" path="/forward.jsp"></forward>
</global-forwards>
action-mappings:配置所有的Action
|- action :配置一个Action
|- attribute、name:用来查找对应的ActionForm,一个Action必须对应一个ActionForm,一个ActionForm可以没有Action,也可以对应多个Action(一对多关系(Form为1,Action为多))
|- input :错误页跳转路径
|- path :当前Action的虚拟映射路径
|- scope :表示Action与ActionForm所保存的属性范围,一般使用request
|- type : 表示创建该Action时的包.类名(反射中使用)

|-forward :配置针对该Action的跳转路径,只能在该Action中使用,其他Action不允许调用
|- name :表示在Action中跳转时所查找的名称
|- path :表示跳转时真实的跳转路径
|- redirect :为true时表示使用客户端跳转,默认使用服务器端跳转。

message-resources:配置资源文件的包.文件名,注意修改资源文件位置时也要在这里进行修改
plug-in:配置支持的插件(自动验证框架,Spring联合开发)


2、编写ActionForm类,此处LoginForm
在ActionForm中包含了属性及属性的getter和setter。
属性要与页面表单中的元素对应, 如果没有对应的属性,会自动报错
javax.servlet.ServletException: No getter method for property userid of bean org.apache.struts.taglib.html.BEAN

在ActionForm中编写验证方法:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package mldn.lin.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
* MyEclipse Struts
* Creation date: 05-08-2009
*
* XDoclet definition:
* @struts.form name="loginForm"
*/
public class LoginForm extends ActionForm {
/*
* Generated fields
*/

// 这里的属性与表单元素一一匹配,否则会报错,说缺少某个元素及其getter和setter方法
// 这些属性的getter和setter方法一般由ActionServlet中通过反射机制建立的ActionForm类对象调用
// 或者在Action类的execute方法中,建立的ActionForm对象调用
// 当然在其他地方的ActionForm对象也可调用

/** password property */
private String password;

/** login property */
private String login;

/*
* Generated Methods
*/

/**
* Method validate:表单的验证,例如非空验证、正则验证等,即进行对接收的表单元素值的合法性验证
* 该方法由ActionServlet中通过反射机制建立的ActionForm类对象调用
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
// 实例化保存错误信息的ActionErrors类对象,
// action会根据此方法的返回值即ActionErrors对象的信息,来决定是否通过验证,以此决定跳转路径
ActionErrors errors=new ActionErrors();

if(login==null || login.trim().equals("")){
// loginerr为在页面显示错误信息时指定错误的属性名称,例如<html:errors property="loginerr" />
// login.err为ApplicationResouces.properties资源文件中的一个key值
// 例如:loginerr.err=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a\uff01(编码为转换码用户名不能为空!转换为ISO8859-1编码的值)
// 转换器在jdk安装路径bin目录下的native2ascii.exe转换
// 通过该key值,可以找到其value,从而知道错误信息是什么,不直接写死,原因是错误信息可以在
// 该资源文件中进行配置,并且可以重复使用
errors.add("loginerr", new ActionMessage("login.err"));
}
if(password==null || password.trim().equals("")){
errors.add("passworderr",new ActionMessage("password.err"));
}

return errors;
}

/**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}

/**
* Returns the password.
* @return String
*/
public String getPassword() {
return password;
}

/**
* Set the password.
* @param password The password to set
*/
public void setPassword(String password) {
this.password = password;
}

/**
* Returns the login.
* @return String
*/
public String getLogin() {
return login;
}

/**
* Set the login.
* @param login The login to set
*/
public void setLogin(String login) {
this.login = login;
}
}

3、修改资源文件,加入编写的错误信息
# Resources for parameter 'org.liky.struts.ApplicationResources'
# Project StrutsDemo

login.err=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF01
password.err=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\uFF01


4、在页面的相应位置显示错误提示信息
  <center>
    <html:form action="login.do" method="post" focus="login">
      <table border="0">
        <tr>
          <td>Login:</td>
          <td><html:text property="login" /></td>
          <td><html:errors property="loginerr" /></td>
        </tr>
        <tr>
          <td>Password:</td>
          <td><html:password property="password" /></td>
          <td><html:errors property="passworderr" /></td>
        </tr>
        <tr>
          <td colspan="3" align="center"><html:submit value="登陆" /></td>
        </tr>
      </table>
    </html:form>
    </center>
5、在Action中编写登陆验证
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package mldn.lin.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import mldn.lin.struts.form.LoginForm;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

/**
* MyEclipse Struts
* Creation date: 05-08-2009
*
* XDoclet definition:
* @struts.action path="/login" name="loginForm" input="/index.jsp" scope="request" validate="true"
*/
public class LoginAction extends Action {
/*
* Generated Methods
*/

/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 自动向下转型为LoginForm(该类为自定义的类,继承了ActionForm类)对象,为的是提取LoginForm中获得的表单元素的值,
// 此处提取过来进行进一步验证用户名和密码是否正确
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub

if("MLDN".equals(loginForm.getLogin()) && "123".equals(loginForm.getPassword())){
//表示用户名与密码正确,通过验证,指定其跳转路径
//此处suc为struts-config.xml文件中的
//<action-mappings >下的<action >下的
//<forward name="suc" path="/suc.jsp" redirect="true"></forward>
// redirect="true"表示客户端跳转方式,不加此属性表示服务器端跳转,默认不加
return mapping.findForward("suc");
}else{
//表示用户名或密码错误,保存错误信息并返回错误信息处理页,该例子中即登陆页
//保存错误信息,保存在ActionMessages类对象中,该类作用同ActionErrors类(ActionForm类validate方法的返回值类型)
ActionMessages errors=new ActionMessages();
//保存错误信息
errors.add("loginfail",  new ActionMessage("loginfail.err"));
// 设置到属性范围中
this.addErrors(request, errors);
//返回错误处理页的路径,即struts-config.xml文件中的
// <action-mappings >下的<action input="/index.jsp"  属性
return mapping.getInputForward();
}

}
}
修改struts-config.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="loginForm" type="mldn.lin.struts.form.LoginForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="loginForm"
      input="/index.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      type="mldn.lin.struts.action.LoginAction" >
      <forward name="suc" path="/suc.jsp" redirect="true"></forward>
      </action>

  </action-mappings>

  <message-resources parameter="mldn.lin.struts.ApplicationResources" />
</struts-config>


6、在资源文件中,增加错误信息的信息
loginfail.err=\u7528\u6237\u540D\u6216\u5BC6\u7801\u9519\u8BEF\uFF01

7、在页面上增加显示错误
        <tr>
          <td colspan="3" align="center"><html:errors property="loginfail" /></td>
        </tr>


六、总结
编写代码的流程为:
1、 加入Struts支持
2、 编写JSP页面(使用html标签)
3、 建立Action与ActionForm
4、 编写ActionForm,加入所有属性及getter和setter方法,并处理验证(validate),在资源文件中配置相应的错误信息
5、 返回JSP显示错误信息(<html:errors>)
6、 编写Action,进行业务逻辑和数据库调用操作,并根据结果跳转(使用mapping.findForward()),forward路径需要加入到struts-config.xml中
7、 如果有错误信息返回,可以通过(this.addErrors)保存错误信息,并使用mapping.getInputForward返回错误页。


C Struts的工作原理
本质的工作原理:
在 JSP 进入ActionServlet后,通过XML解析读取核心配置文件中的action和form的配置,根据提交的路径与aciton中的path属性比较,找到所要提交的action,再根据该action的attribute属性找到对应actionForm的name,从而创建actionForm,再依据反射机制,将所有属性赋值,并调用validate方法,根据该方法的返回结果,判断是否有错误出现,如果有,返回action中配置的input错误页属性,如果没有,创建action,并将actionForm等参数传入,再根据action的execute方法返回结果,决定跳转的路径。

Struts工作流程:

从jsp跳转后根据web.xml中配置的 ActionServlet的*.do,进入ActionServlet,ActionServlet根据struts-config.xml找到对应的ActionForm和Action,先进入ActionForm进行赋值和验证操作,根据验证结果决定跳转路径,如果失败则根据struts-config.xml中的定义的input属性跳转错误页,并显示错误信息,而成功时,则进入action的execute方法,进行业务逻辑等操作,再根据结果跳转(跳转时查询struts-config.xml中的forward配置),进行跳转。

D 关于ActionForm的参数接收
1、默认接收的参数都按String类型处理,也可以在ActionForm中定义属性为其他类型
2、当接收的数据为数字类型(int、double),ActionServlet在进行赋值时,会自动对数据进行转换,但当转换出现错误时,默认按0进行处理。如果希望自行对数字类型进行格式处理,需要使用String类型进行接收,再单独转型
3、日期类型直接提交会出现不匹配的错误
java.lang.IllegalArgumentException: Cannot invoke org.liky.struts.form.RegistForm.setBirthday - argument type mismatch

因为Struts无法确定转换方法,因此传递日期类型时,必须使用字符串接收,再通过SImpleDateFormat类手工进行转换
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package org.liky.struts.form;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
* MyEclipse Struts Creation date: 05-08-2009
*
* XDoclet definition:
*
* @struts.form name="registForm"
*/
public class RegistForm extends ActionForm {
/*
* Generated fields
*/

/** password property */
private String password;

/** age property */
private String age;

/** userid property */
private String userid;

/** birthday property */
private String birthday;

/*
* Generated Methods
*/

/**
* Method validate
*
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
// 该方法返回值类型为ActionErrors,如果返回的该对象中包含错误信息,表示返回错误页,进行信息显示
// 如果不包含错误信息,则继续执行到Action中进行处理
ActionErrors error = new ActionErrors();
// 所有错误信息保存在ApplicationResouces.properties资源文件中
if (userid == null || userid.trim().equals("")) {
error.add("userid", new ActionMessage("userid.err"));
}
if (password == null || password.trim().equals("")) {
error.add("password", new ActionMessage("pass.err"));
}
// 对输入的日期进行格式化验证
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
sf.parse(this.birthday);
} catch (ParseException e) {
// 出现异常时表示输入的格式错误,可以直接将错误信息保存到ActionErrors中
error.add("birthday", new ActionMessage("date.err"));
}
// 对年龄进行验证处理
try {
int temp = Integer.parseInt(this.age);
if (temp <= 0 || temp >= 100) {
// 如果超出范围,则提示错误信息
error.add("age", new ActionMessage("age.err"));
}
} catch (NumberFormatException e) {
// 出现异常时表示输入的格式错误,可以直接将错误信息保存到ActionErrors中
error.add("age", new ActionMessage("age.err"));
}

return error;
}

/**
* Method reset
*
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}

/**
* Returns the password.
*
* @return String
*/
public String getPassword() {
return password;
}

/**
* Set the password.
*
* @param password
*            The password to set
*/
public void setPassword(String password) {
this.password = password;
}

/**
* Returns the age.
*
* @return int
*/
public String getAge() {
return age;
}

/**
* Set the age.
*
* @param age
*            The age to set
*/
public void setAge(String age) {
this.age = age;
}

/**
* Returns the userid.
*
* @return String
*/
public String getUserid() {
return userid;
}

/**
* Set the userid.
*
* @param userid
*            The userid to set
*/
public void setUserid(String userid) {
this.userid = userid;
}

/**
* Returns the birthday.
*
* @return Date
*/
public String getBirthday() {
return birthday;
}

/**
* Set the birthday.
*
* @param birthday
*            The birthday to set
*/
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}

4、对于单选按钮、下拉列表提交的数据,如果确定都为数字时,可以直接用int等类型接收。
5、多选按钮时,使用数组进行接收,如果确定为数字,可以使用int[]等格式,如果不确定需要通过String[]进行验证。
6、可以在验证数字和日期时,将合法数据直接赋值
修改注册页面,将属性直接赋值到对象中
<%@ page language="java" pageEncoding="GBK"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
<head>
<html:base />

<title>index.jsp</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>
<center>
<font color="red">
<html:errors/>
</font>

<html:form action="regist.do" method="post" focus="user.userid">
<table border="0">
<tr>
<td>
用户ID:
</td>
<td>
<html:text property="user.userid" />
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<html:password property="user.password" />
</td>
</tr>
<tr>
<td>
年龄:
</td>
<td>
<html:text property="user.age" />
</td>
</tr>
<tr>
<td>
生日:
</td>
<td>
<html:text property="user.birthday" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<html:submit value="注册"/>
</td>
</tr>
</table>
</html:form>
</center>
</body>
</html:html>

/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package org.liky.struts.form;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.liky.vo.User;

/**
* MyEclipse Struts Creation date: 05-08-2009
*
* XDoclet definition:
*
* @struts.form name="registForm"
*/
public class RegistForm extends ActionForm {
/*
* Generated fields
*/

private User user = new User() ;//必须实例化,否则出现错误:
// javax.servlet.ServletException: Invalid argument looking up property user.userid of bean org.apache.struts.taglib.html.BEAN


/** age property */
private String age;


/** birthday property */
private String birthday;

/*
* Generated Methods
*/

/**
* Method validate
*
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
// 该方法返回值类型为ActionErrors,如果返回的该对象中包含错误信息,表示返回错误页,进行信息显示
// 如果不包含错误信息,则继续执行到Action中进行处理
ActionErrors error = new ActionErrors();
// 所有错误信息保存在ApplicationResouces.properties资源文件中
if (this.user.getUserid() == null || this.user.getUserid().trim().equals("")) {
error.add("userid", new ActionMessage("userid.err"));
}
if (this.user.getPassword() == null || this.user.getPassword().trim().equals("")) {
error.add("password", new ActionMessage("pass.err"));
}
// 对输入的日期进行格式化验证
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
try {
//对于合法数据的处理
this.user.setBirthday(sf.parse(this.birthday));
} catch (ParseException e) {
// 出现异常时表示输入的格式错误,可以直接将错误信息保存到ActionErrors中
error.add("birthday", new ActionMessage("date.err"));
}
// 对年龄进行验证处理
try {
int temp = Integer.parseInt(this.age);
if (temp <= 0 || temp >= 100) {
// 如果超出范围,则提示错误信息
error.add("age", new ActionMessage("age.err"));
} else {
this.user.setAge(temp);
}
} catch (NumberFormatException e) {
// 出现异常时表示输入的格式错误,可以直接将错误信息保存到ActionErrors中
error.add("age", new ActionMessage("age.err"));
}

return error;
}

/**
* Method reset
*
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}

/**
* Returns the age.
*
* @return int
*/
public String getAge() {
return age;
}

/**
* Set the age.
*
* @param age
*            The age to set
*/
public void setAge(String age) {
this.age = age;
}


/**
* Returns the birthday.
*
* @return Date
*/
public String getBirthday() {
return birthday;
}

/**
* Set the birthday.
*
* @param birthday
*            The birthday to set
*/
public void setBirthday(String birthday) {
this.birthday = birthday;
}

public User getUser() {
return user;
}

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

E Structs的Bean标签
一、Struts框架中包含以下三种主要标签:
1、 Bean标签:用来处理属性范围中的属性(添加,修改,显示),国际化处理
2、 Logic标签:用来处理逻辑判断和迭代功能
3、 Html标签:用来在页面上显示错误信息,编写表单数据。

二、Bean标签的所有方法:
1、bean:define:用来复制或创建属性的
<bean:define id="test" value="MLDN"></bean:define>
<bean:define id="newtest" name="test" toScope="session"></bean:define>
<bean:define id="newtest" name="test" scope="session"></bean:define>
toScope中可以配置4种属性范围,如果没有设置,默认为page范围
如果在不同属性范围中已经包含了两个同名的属性,可以通过scope来决定复制的属性是哪一个,如果不配置scope,默认为取得最小范围的属性进行复制
使用name与value的区别:
value表示创建新的属性,属性值就是value里面配置的值
name表示复制属性,要复制的属性在属性范围中的名称为name里的值
以上两个不可能同时使用。
当使用name进行复制时,可以通过property选择复制一个对象中的某一个属性
<bean:define id="newtest" name="user" property="userid" scope="request"></bean:define>
2、bean:size:将一个集合的size保存到属性范围中
<bean:size id="allsize" name="all" scope="request"/>
all为属性范围中的一个集合
3、bean:include:将一个页面里所有的信息保存到属性范围
<bean:include id="includevalue" page="/taglib/index.jsp"/>
显示该页面
${includevalue }
注意数据只是保存到属性范围中,而要显示需要通过EL进行输出
page中的路径为绝对路径(加/)
4、 bean:resource:将一个资源文件或xml包含到属性范围中,使用方法与bean:include类似。
2-4开发中不用
5、 bean:write:显示属性范围中保存的属性,与EL功能类似
<%
request.setAttribute("test","MLDN");
%>
EL方式:${test } <br>
标签方式:<bean:write name="test"/>
如果要显示属性,需要使用property
<%
User user = new User();
user.setUserid("Liky");
request.setAttribute("test",user);
%>
EL方式:${test.userid } <br>
标签方式:<bean:write name="test" property="userid"/>
假设显示的数据中出现HTML代码
<%
User user = new User();
user.setUserid("<font color='red'>Liky</font>");
request.setAttribute("test",user);
%>
EL方式:${test.userid } <br>
标签方式:<bean:write name="test" property="userid"/>
EL方式会直接将HTML代码编译处理,并生成显示效果
标签会直接将显示的数据显示到页面上,而不会出现代码的效果。
通过filter=false属性可以控制是否对<、>等页面特殊字符进行处理
<%
User user = new User();
user.setUserid("<font color='red'>Liky</font>");
request.setAttribute("test",user);
%>
EL方式:${test.userid } <br>
标签方式:<bean:write name="test" property="userid" filter="false"/>

6、标签可以对数据进行格式化处理
(1)日期
<%

request.setAttribute("test",new Date());
%>
EL方式:${test } <br>
标签方式:<bean:write name="test" format="yyyy-MM-dd"/>
其中yyyy等规则与SimpleDateFormat中定义的规则一致

(2)数字格式化:一般都是在显示金额时使用。
<%

request.setAttribute("test",8.4594);
%>
EL方式:${test } <br>
标签方式:<bean:write name="test" format="#,##0.00"/>
对于金额一般使用以上格式处理。

(3)通过资源文件的配置,在格式处理上,提供了全局格式化配置,可以对int、double和Date的显示进行配置,配置后所有bean:write输出的该格式数据都为这种显示形式。

修改资源文件
org.apache.struts.taglib.bean.format.date=yyyy\u5e74MM\u6708dd\u65e5
org.apache.struts.taglib.bean.format.int=#,##0.00
org.apache.struts.taglib.bean.format.float=#,##0.00

7、bean:message标签,国际化
注意:(1)页面上出现的所有文字,都要使用bean:message显示
(2)所有显示到页面的信息,必须使用资源文件保存。
(3)支持几种语言,就需要建立几个资源文件。
(4)资源文件的命名,需要在文件名中拼入支持的语言种类
  
msg.userid=Userid
msg.pass=Password
msg.age=Age
msg.birthday=Birthday
msg.regist=Regist
msg.userid=\u30e6\u30fc\u30b6\u540d
msg.pass=\u30d1\u30b9\u30ef\u30fc\u30c9
msg.age=\u5e74\u9f62
msg.birthday=\u8a95\u751f\u65e5
msg.regist=\u767b\u9332
msg.userid=\u7528\u6237\u540d
msg.pass=\u5bc6\u7801
msg.age=\u5e74\u9f84
msg.birthday=\u751f\u65e5
msg.regist=\u6ce8\u518c
页面显示
<html:form action="regist.do" method="post" focus="user.userid">
<table border="0">
<tr>
<td>
<bean:message key="msg.userid"/>:
</td>
<td>
<html:text property="user.userid" />
</td>
</tr>
<tr>
<td>
<bean:message key="msg.pass"/>:
</td>
<td>
<html:password property="user.password" />
</td>
</tr>
<tr>
<td>
<bean:message key="msg.age"/>:
</td>
<td>
<html:text property="age" />
</td>
</tr>
<tr>
<td>
<bean:message key="msg.birthday"/>:
</td>
<td>
<html:text property="birthday" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="<bean:message key='msg.regist'/>"/>
</td>
</tr>
</table>
</html:form>
分享到:
评论

相关推荐

    Struts 2练习源码 第一天001

    Struts 2练习源码 第一天001Struts 2练习源码 第一天001Struts 2练习源码 第一天001Struts 2练习源码 第一天001Struts 2练习源码 第一天001Struts 2练习源码 第一天001Struts 2练习源码 第一天001Struts 2练习源码 ...

    struts2第一天课件

    本课件旨在帮助初学者快速掌握Struts2的核心概念和技术,通过"struts2第一天课件"的学习,你将能够了解到Struts2的基本架构、配置以及实际应用。 首先,了解Struts2框架的基础。Struts2是Apache软件基金会的开源...

    struts2课件第四天

    在"struts2课件第四天"的学习中,我们将深入探讨Struts2的核心概念、配置以及实战应用。 1. **Struts2框架介绍** Struts2是由Apache软件基金会维护的一个开源项目,它继承了Struts1的优点并弥补了其不足,提供了更...

    struts2第一源代码11

    接下来,我们关注一下“第一天”源代码中可能包含的内容: 1. **Action类**:源代码中可能包含一个或多个Action类,每个类对应一个具体的用户操作或功能。 2. **配置文件**:struts.xml文件可能会定义这些Action类...

    struts2课件第二天

    在"struts2课件第二天"中,我们可以深入学习Struts2的核心概念和实际应用。 1. **Struts2框架基础** - Struts2是Apache软件基金会的开源项目,它是Struts1的升级版,弥补了Struts1的一些不足。 - Struts2的核心是...

    struts2课件第六天(最后一天)

    本课件“Struts2课件第六天(最后一天)”可能涵盖了Struts2框架的高级特性和实际应用,包括jQuery插件的集成以及图表展示功能。 首先,我们来了解一下Struts2的基础知识。Struts2是Apache软件基金会的一个开源项目...

    struts2课件第五天

    本课件主要聚焦在Struts2的第五天课程内容,涵盖了Struts2的核心概念、配置以及实际应用。 在Struts2框架中,最重要的概念之一是Action类,它是业务逻辑的入口点。每个Action类通常对应一个用户请求,处理来自视图...

    struts2框架学习之第一天

    学习struts2框架,一些国企公司的框架一般再用,有疑问的小伙伴欢迎一起讨论,共同成长进步。

    Struts2_day01笔记

    学习Struts2第一天的笔记

    struts2学习 源码

    在"day06"这个文件夹中,很可能包含了第六天学习的Struts2相关源代码和示例。这些示例可能涵盖了Action的创建、配置文件的编写、拦截器的使用、结果类型的配置以及OGNL表达式的实践等。通过这些代码,初学者可以逐步...

    搭建第一个struts2框架,实现简单那登录功能

    在这个“搭建第一个Struts2框架,实现简单登录功能”的教程中,我们将探讨如何从零开始创建一个基础的Struts2应用。 首先,我们需要在本地环境中安装Java Development Kit (JDK) 和 Apache Tomcat 服务器,这是运行...

    struts2第一源代码及说明

    1. **第一天.rar**:可能包含了Struts2基础的介绍,包括环境搭建、第一个Hello World程序的创建、Action的编写以及简单的请求处理。这部分内容是学习Struts2的入门阶段,帮助开发者熟悉框架的基本用法。 2. **传智...

    struts2基本框架demo

    接下来,我们将深入探讨如何运行这个"第一天demo": 1. **环境搭建**:确保你已经安装了Java开发环境(JDK)、Apache Tomcat服务器以及Eclipse或IntelliJ IDEA这样的集成开发环境。还需要在项目中添加Struts2的依赖...

    struts2教程源代码

    "strut2课程源代码第一天及说明"可能包含了逐步的教程,指导你从零开始搭建和运行一个简单的Struts2应用。 标签"struts2例子代码"表明这些源代码包含了具体的操作示例,比如Action类的编写、配置文件的设置、拦截器...

    struts2第二天源代码

    这个"Struts2第二天源代码"可能是指一系列学习或教程资源,其中包含了Struts2框架的第二天学习内容。在这个压缩包中,很可能是包含了第二天课程相关的源代码示例,帮助学习者深入理解Struts2的工作原理和开发实践。 ...

    springmvc第一天课堂笔记.docx

    1. **前端控制器 DispatcherServlet**:这是SpringMVC的第一个环节,负责接收客户端发送的HTTP请求,并将其转发给合适的处理器进行处理。DispatcherServlet本质上是一个Servlet,因此需要在`web.xml`文件中进行配置...

    Struts1.0 开发指南 多个文档

    Struts1.0学习文档-初学者入门.doc Struts,MVC 的一种开放源码实现.doc ...struts傻瓜式学习(一天篇).doc 实例学习 Struts.doc 样章第02章 第一个Struts应用helloapp应用.doc 用Struts建立MVC应用的介绍.doc

    黑马程序员struts2框架2016版资料

    - **基础篇**:介绍Struts2的基本概念、安装及环境搭建,讲解如何创建第一个Struts2应用。 - **配置篇**:详细解析Struts2的配置文件,包括Action、Interceptor、Result等的配置。 - **Action与模型绑定**:讲解如何...

    struts2代码

    在第一天的学习中,你可能会接触到Struts2的基础概念和环境搭建。首先,你需要了解Struts2的核心组件,如Action、Result、Interceptor等。Action是业务逻辑处理的主要载体,Result负责展示结果视图,而Interceptor则...

    springmvc第一天.pdf

    SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型...的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。 SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Sprin

Global site tag (gtag.js) - Google Analytics