参考书籍:《J2EE开源编程精要15讲》

Struts配置文件struts-config.xml

  Struts核心文件,可配置各种组件,包括Form Beans、Actions、ActionMappings、全局转发GlobalForwards、数据源DataSource及插件Plugins。

 <?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="loginForm" type="struts.form.LoginForm" /> </form-beans> <global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="struts.action.LoginAction"
cancellable="true" >
<forward name="Success" path="/main.jsp" />
<forward name="Fail" path="/register.jsp" />
</action>
</action-mappings> <message-resources parameter="struts.ApplicationResources" />
</struts-config>

  <form-beans>元素允许配置多个ActionForm类

    name属性指定ActionForm的唯一标识名,Struts框架用该标识来引用这个Form Bean,必需

    type属性指定ActionForm的完整路径名和类名,必需

    动态ActionForm还需配置子元素<form-property>,指定表单字段  

  <action-mappings>元素帮助进行框架内部的流程控制,可将请求URI映射到Action类,关联Action对象和ActionForm对象,可定义多个<action>子

  元素。

    <action>子元素所描述的是特定请求路径和相应Action类之间的映射关系,Struts控制器将请求中的URI路径与诸多<action>元素的path属性匹

    配,以选中特定映射

      attribute属性设置和Action相关联的Form Bean在request/session内的属性key,通过request/session的getattribute(attribute)返回实例

      forward属性指定局部转发项

      input属性指定表单输入页面的URL路径

      name属性指定同改Action关联的Form Bean的引用标识

      path属性指定Action的访问路径,即在引用中的标识名,以"/"开头

      type属性指定该Action类的完整路径和类名

      scope属性指定同该Action类关联的Form Bean的存在范围(request和session),默认session

      validate属性指定是否调用Form Bean的validate()方法,默认为true

    <action>元素可包含多个<forward>子元素,定义转发动作

      name属性指定转向标识名

      path属性转向标识名所对应的转向页面

  

  <global-forwards>元素定义整个应用程序内的全局转发,可定义多个<forward>子元素,用法同<action>

  <message-resources>元素用于配置消息资源文件,以在应用的客户端界面输出本地化消息文本

    parameter属性指定消息资源文件存放路径

Struts的中央控制器

  多个组件分担控制器的工作,ActionServlet类、RequestProcessor类、Action类等,其中ActionServlet类是核心控制器。当ActionServlet接受到用户请求时,将执行如下流程:

  1. 检索和用户请求匹配的ActionMapping实例,如果不存在,返回错误信息

  2. 如果为ActionMapping配置了Form Bean,获取相应范围内的ActionForm实例。如果实例不存在,就创建一个,并保存客户提交数据

  3. 根据配置信息决定是否验证表单(validate()方法),验证出错则返回input属性指定的页面,并显示错误信息

  4. ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给对应Action,实例不存在则新建,调用Action的execute()方法

  5. execute()方法返回一个ActionForward对象,如果该对象是JSP,则返回视图给用户;如果该对象是Action,则进入对应Action

  1) ActionServlet类

    第一次被加载后,调用init()方法,执行初始化工作。然后Web容器调用doPost()或doGet()方法来处理用户请求,而它们实际上都是调用process()方法具体处理请求

  2) RequestProcessor类

    ActionServlet的process()方法中实际处理请求的是RequestProcessor类的process()方法。Struts框架之允许应用程序存在一个ActionServlet类,但每个应用程序模块都有各自的RequestProcessor类实例。在ActionServlet的process()方法中,一旦选择了正确的应用程序模块,就会调用相应模块的RequestProcessor实例的process()方法来处理请求。

  3) ActionServlet在web.xml中的配置

 <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>

  ActionServlet的URL映射是"*.do",在浏览器中输入任何后缀为".do"的URL时,系统会映射到ActionServlet

Action类及其相关类

  1) Action类

    通常设计为代替客户完成某种操作,是客户请求和业务逻辑操作间的桥梁。在Struts应用程序中,需要扩展Action类,提供execute()方法的一个实现。Action类通过getter方法从ActionForm对象中获得表单数据,调用模型组件处理这些数据,通过ActionMapping对象的findForward()方法获得一个ActionForward对象,把处理结果发给ActionForward对象所指目标

 /*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package struts.action; import struts.form.*; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; /**
* MyEclipse Struts
* Creation date: 03-08-2015
*
* XDoclet definition:
* @struts.action path="/login" name="loginForm" input="/login.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 loginForm = (LoginForm) form;// TODO Auto-generated method stub
//从Form Bean中取出表单数据
String username=loginForm.getUsername();
String password=loginForm.getPassword(); //生成一个Session对象,在main.jsp和register.jsp中可以根据Session对象获取用户名
HttpSession session=request.getSession(true);
session.removeAttribute("username");
session.setAttribute("username", username); //调用业务逻辑组件,检查该用户是否已注册
LoginHandler login=new LoginHandler();
boolean mark=login.checkLogin(username,password); //根据查询结果跳转
String prompt;
if(mark)
prompt="Success";
else
prompt="Fail";
return mapping.findForward(prompt);
}
}

  2) ActionMapping类

    用来存储特定请求映射到特定Action的相关信息。封装了配置文件中action元素所包含的信息。在execute()方法中完成本地转发

  3) ActionForward类

    代表一个Web资源的逻辑抽象表现形式

ActionForm类及表单数据验证

  ActionForm本质上是一种JavaBean,专门用来传递表单数据的DTO(Data Transfer Object)。包括表单数据验证的validate()方法和用于数据复位的reset()方法。ActionForm有request和session两种作用域,表示ActionForm实例的作用范围。

  1. 创建ActionForm

 /*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package 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; /**
* MyEclipse Struts
* Creation date: 03-08-2015
*
* XDoclet definition:
* @struts.form name="loginForm"
*/
public class LoginForm extends ActionForm {
/*
* Generated fields
*/ /** username property */
private String username; /** password property */
private String password; /*
* Generated Methods
*/ /**
* Method validate
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
} /**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
} /**
* Returns the username.
* @return String
*/
public String getUsername() {
return username;
} /**
* Set the username.
* @param username The username to set
*/
public void setUsername(String username) {
this.username = username;
} /**
* 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;
}
}

  定义具体属性和相应getter、setter方法,与表单中的输入域属性一一对应,覆写reset()和validate()方法

  2. 配置ActionForm

    <form-beans >

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

    </form-beans>

    <form-beans>元素指定全体ActionForm配置,<form-bean>配置一个具体ActionForm类

  3. 访问ActionForm

    1) 使用Struts HTML标记库

      如<html:form>,<html:text>等

    2) 从request或session对象中取出ActionForm对象

      如:LoginActionForm form=(LoginActionForm)request.getAttribute("loginActionForm");

    3) 通过Action类的execute()方法直接访问ActionForm

  

  表单数据验证

    1) 重写validate()方法

 /*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package 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: 03-08-2015
*
* XDoclet definition:
* @struts.form name="loginForm"
*/
public class LoginForm extends ActionForm {
/*
* Generated fields
*/ /** username property */
private String username; /** password property */
private String password; /*
* Generated Methods
*/ /**
* Method validate
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors=new ActionErrors();
if((username==null)||(username.length()<3)){
errors.add("name",new ActionMessage("error.username.required",username));
}
if((password==null)||(password.length()<3)){
errors.add("psw",new ActionMessage("error.password.required",password));
}
return errors;
} /**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
} /**
* Returns the username.
* @return String
*/
public String getUsername() {
return username;
} /**
* Set the username.
* @param username The username to set
*/
public void setUsername(String username) {
this.username = username;
} /**
* 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;
}
}

    2) 在资源文件ApplicationResources.properties中设置可能的验证错误的标识

    3) 在配置文件struts-config.xml中,把<action>元素的validate属性设置为true并添加<message-resources>元素以指定资源文件存放路径

 <?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="loginForm" type="struts.form.LoginForm" /> </form-beans> <global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="struts.action.LoginAction"
validate="true"
cancellable="true" >
<forward name="Success" path="/main.jsp" />
<forward name="Fail" path="/register.jsp" />
</action>
</action-mappings> <message-resources parameter="struts.ApplicationResources" />
</struts-config>

    4) 在相应输入页面的相应位置加入错误标记<html:errors>,以输出可能的验证错误

 <%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <html>
<head>
<title>JSP for LoginForm form</title>
</head>
<body>
<html:form action="/login">
username : <html:text property="username"/><html:errors property="username"/><br/>
<font color="red"><html:errors property="name"/></font><br/>
password : <html:text property="password"/><html:errors property="password"/><br/>
<font color="red"><html:errors property="psw"/></font><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>

Struts常用标记库

  参考http://blog.csdn.net/hollboy/article/details/9197025

应用实例 学生信息登记系统:http://pan.baidu.com/s/1o6OH5zk

PS:中文乱码解决方案

try{

  name=new String(name.getBytes("ISO-8859-1"),"utf-8");

  sex=new String(sex.getBytes("ISO-8859-1"),"utf-8");

}catch(Exception e){

  e.printStackTrace();
}

由于Myeclipse的默认编码格式为ISO-8859-1,不支持中文,所以需要转换编码格式

Java Web编程的主要组件技术——Struts核心组件的更多相关文章

  1. Java Web编程的主要组件技术——Struts入门

    参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少 ...

  2. Java Web编程的主要组件技术——Hibernate核心组件

    参考书籍:<J2EE开源编程精要15讲> Hibernate配置文件 1) hibernate.cfg.xml <?xml version='1.0' encoding='UTF-8 ...

  3. Java Web编程的主要组件技术——Struts的高级功能

    参考书籍:<J2EE开源编程精要15讲> Struts对国际化的支持 "国际化"(I18N)指一个应用程序在运行时能根据客户端请求所来的国家/地区.语言的不同显示不同的 ...

  4. Java Web编程的主要组件技术——MVC设计模式

    参考书籍:<J2EE开源编程精要15讲> MVC(Model View Controller),Model(模型)表示业务逻辑层,View(视图)代表表述层,Controller(控制)表 ...

  5. Java Web编程的主要组件技术——JDBC

    参考书籍:<J2EE开源编程精要15讲> JDBC(Java DataBase Connectivity)是Java Web应用程序开发的最主要API之一.当向数据库查询数据时,Java应 ...

  6. Java Web编程的主要组件技术——Servlet

    参考书籍:<J2EE开源编程精要15讲> Servlet是可以处理客户端传来的HTTP请求,并返回响应,由服务器端调用执行,有一定编写规范的Java类. 例如: package test; ...

  7. Java Web编程的主要组件技术——Hibernate入门

    参考书籍:<J2EE开源编程精要15讲> Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系 ...

  8. Java Web编程的主要组件技术——JSP

    参考书籍:<J2EE开源编程精要15讲> JSP(Java Server Page)页面由HTML代码和嵌入其中的Java代码组成. 简单的JSP页面如: <html> < ...

  9. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

随机推荐

  1. [C#]Linq To Xml 介绍- 转

    LINQ to XML 类概述 LINQ to XML 旨在使 XML 名称尽可能简单.     XAttribute 类 XAttribute 表示一个 XML 属性. XCData 类 XCDat ...

  2. 2433: [Noi2011]智能车比赛 - BZOJ

    Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi, ...

  3. 2109&2535: [Noi2010]Plane 航空管制 - BZOJ

    Description世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上, ...

  4. angular入门系列教程3

    主题: 本篇主要目的就是继续完善home页,增加tab导航的三个页index index1 index2 效果图: 细节: 初始化的JS就是咱们的home.js,仔细来看. angular的route ...

  5. java.util.ConcurrentModificationException 解决办法(转)

    今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码:   public cla ...

  6. C# IL DASM 使用

    IL DASM反编译工具 使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识.我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改.感觉他还是很强大. IL ...

  7. [转载]C#获取进程的主窗口句柄

    public class User32API { private static Hashtable processWnd = null; public delegate bool WNDENUMPRO ...

  8. iOS开发之数据存取3-CoreData自定义数据类型

    当系统提供的类型不能达到我们的使用要求时,比如我想在CoreData中存储UIColor,该怎么办呢? 这时候就要用到CoreData中非常强大的一个存储类型了:Transformable 下面将通过 ...

  9. css3选择器笔记

    通用选择器ul~p{}  为ul之后的所有p标签设置属性 (ul和p为同级元素)ul+p{} 仅为ul之后的p标签设置属性 (ul和p为相邻元素)div>p  为div之后的p标签设置属性{ d ...

  10. [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

    跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...