当前位置: 代码迷 >> Web前端 >> struts1.2 学习札记(教程)
  详细解决方案

struts1.2 学习札记(教程)

热度:509   发布时间:2012-08-31 12:55:03.0
struts1.2 学习笔记(教程)

struts1.2 学习笔记(教程)

2009-11-05 15:38

ZT:http://blog.csdn.net/toyouheart/archive/2009/09/01/4509466.aspx

status学习笔记及历程

第一讲:

1. 了解struts工作流程:

首先struts基于MVC模式, 用户发送的请求讲被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>

... ...

</servlet>

<servlet-mapping>

??? <servlet-name>action</servlet-name>

??? <url-pattern>*.do</url-pattern>

</servlet-mapping>

上面描述*.dourl请求都会被ActionServlet接受.

完整配置讲解:
?? /*************************************************************
??? 1. web.xml

web.xml文件对任何的Web项目都是一个必须的文件,使用Struts时,还需要对该文件进行一
些必须的配置。

1.1 ActionServlet的配置 一般需要在该文件中配置StrutsServlet,示例配置如下:

Eg1. 简单的StrutsActionServlet的配置:

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


对于复杂的应用,一般需要配置多个struts-config.xml文件,可以通过添加另外的
<init-param>
来实现,或者在多个配置文件中以为“,”隔开,如下所示:

Eg2. 配置多个struts-config.xml配置文件的ActionServlet的配置:

<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>config/IVR</param-name>

?????
????? <param-value>/WEB-INF/struts-config-IVR.xml</param-v
????? alue>

??? </init-param>

??? <init-param>

??? <param-name>config/wap</param-name>

????? <param-value>

??????? /WEB-INF/struts-config-wap.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>

1.2 欢迎和错误处理的配置
首先讲述一下欢迎文件清单<welcome-file-list>的配置,该元素可包含多个<welcome-file
>
子元素,当Web容器调用欢迎界面时,将首先查看第一个<welcome-file>子元素中定义的文
件是否存在,若存在,则将其返回给用户,若不存在,继续判断第二个<welcome-file>子元
素中定义的文件……,配置示例如下:

<welcome-file-list>

???? <welcome-file>index.html</welcome-file>

???? <welcome-file>index.jsp</welcome-file>

???? <welcome-file>default.jsp</welcome-file>

</welcome-file-list>


接着讲述一下在web.xml中如何配置错误处理,这时需要使用<error-page>元素,该
元素可以根据异常的类型来配置跳转的页面,还可以根据错误码来配置跳转页面,配
置示例如下:

<!-- 根据错误码进行跳转-->

<error-page>

<error-code>500</error-code>

<location>/error.jsp</location>

</error-page>

<!-- 根据异常进行跳转-->

<error-page>

<exception-type>java.lang.NullException</exception-type>

<location>/error.jsp</location>

</error-page>

1.3 tld文件的配置
Web工程没有使用Struts的标签库,可以不在web.xml中使用Struts的标签库信息。当然若
开发人员使用了struts的标签库,也可以直接在jsp页面中引入标签库,例如通过如下方式引
入:

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

<%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested"%>

???????
Struts中进行配置的的好处是因为可以在Struts中配置为tld文件配置一个简要的
名称或者更加易懂的名称,例如在web.xml文件中增加如下配置:

<taglib>

???? <taglib-uri>/tags/struts-bean</taglib-uri>

???? <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

</taglib>

<taglib>

???? <taglib-uri>/tags/struts-html</taglib-uri>

???? <taglib-location>/WEB-INF/struts-html.tld</taglib-location>

</taglib>

<taglib>

???? <taglib-uri>/tags/struts-logic</taglib-uri>

???? <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

</taglib>

<taglib>

???? <taglib-uri>/tags/struts-nested</taglib-uri>

???? <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>

</taglib>

???????
其中<taglib-uri>元素指定标签库的相对或者绝对URI地址,Web应用将根据这一URI
来访问标签库;<taglib-location>元素指定标签库描述文件在文件资源系统中的物
理位置。

此时在jsp页面通过如下方面引入标签库:

<%@ taglib uri="/tags/struts-bean " prefix="bean"%>

<%@ taglib uri="/tags/struts-html" prefix="html"%>

<%@ taglib uri="/tags/struts-logic " prefix="logic"%>

<%@ taglib uri="/tags/struts-nested " prefix="nested"%>

1.4 完整配置实例
下面举一个使用StrutsWeb项目的web.xml的简单配置实例(该实例开发人员也参考struts
-1.2.8-bin.zip
包的webapps目录下的struts-mailreader.war),内容如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>

?? <display-name>Struts Example Application</display-name>

<!-- Action Servlet Configuration -->

<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,
?????? /WEB-INF/struts-config-registration.xml</param-value>

???? </init-param>

???? <load-on-startup>1</load-on-startup>

</servlet>

<!-- Action Servlet Mapping -->

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

<!-- 错误处理 -->

<error-page>

??? <exception-type>java.lang.Exception</exception-type>

??? <location>/error.jsp</location>

</error-page>

<taglib>

???? <taglib-uri>/tags/struts-bean</taglib-uri>

???? <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

</taglib>

<taglib>

???? <taglib-uri>/tags/struts-html</taglib-uri>

???? <taglib-location>/WEB-INF/struts-html.tld</taglib-location>

</taglib>

<taglib>

???? <taglib-uri>/tags/struts-logic</taglib-uri>

???? <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

</taglib>

<taglib>

???? <taglib-uri>/tags/struts-nested</taglib-uri>

???? <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>

</taglib>

</web-app>

2 .properties资源文件
默认情况下,Struts默认的资源文件为ApplicationResources.properties文件。

资源文件可为一个束,可针对不同的语言,写不同的资源文件,开发人员可以定义英文、简
体中文、繁体中文、日文等资源文件,资源文件的命名格式为:资源文件名_国别_语言.pro
perties
,常见的资源文件名称为:

??????? ApplicationResources.properties:默认资源文件,或英文资源文件

??????? ApplicationResources_zh_CN.properties:简体中文

??????? ApplicationResources_zh_TW.properties:繁体中文

???????
???????
每一个资源文件都是-对的集合,例如可在src目录下的资源文件Application
??????? Resources.properties
中,编写如下内容:

UserForm.userName = USERNAME

UserForm.password = PASSWORD

???????
???????
同时在src目录下建立ApplicationResources_zh_CN.properties.bak文件来编写简体
???????
中文的原始资源文件,内容如下:

UserForm.userName = 用户名

UserForm.password = 密码

???????
???????
开发人员还可以建立ApplicationResources_zh_TW.properties.bak文件编写繁体中
???????
文的原始资源文件。其内容如下:

UserForm.userName = ノめ?W

UserForm.password = ノめ?W

???????
???????
对于简体中文和繁体中文文件,开发人员还需要对其使用native2ascii工具对其进行
???????
转换,将非ASCII码转换为Unicode编码,native2ascii工具在%JAVA_HOME%/bin目录
???????
下的native2ascii.exe,因此若要进行这种转换,读者首先需要安装了该工具。安装
???????
了该工具之后,进入其所在目录,运行native2ascii…命令可进行编码转换,为了能
???????
在命令行直接使用该命令,读者还需要在系统变量PATH中添加路径:%JAVA_HOME%"b
??????? in

??????? 在实际项目中,一般编写一个批处理文件(eg.
??????? code.bat)
来处理资源文件的编码,例如code.bat为如下内容时,可满足要求将如上
???????
ApplicationResources_zh_CN.properties.bak文件进行编码,并将编码后的信息
???????
放入ApplicationResources_zh_CN.properties文件中。该批处理文件的内容如下所
???????
示:

del ApplicationResources_zh_CN.properties

copy ApplicationResources_zh_CN.properties.bak
ApplicationResources_zh_CN.properties.gbk

native2ascii -encoding GBK ApplicationResources_zh_CN.properties.gbk
ApplicationResources_zh_CN.properties

del ApplicationResources_zh_CN.properties.gbk

del ApplicationResources_zh_TW.properties

copy ApplicationResources_zh_TW.properties.bak
ApplicationResources_zh_TW.properties.big5

native2ascii -encoding Big5 ApplicationResources_zh_TW.properties.big5
ApplicationResources_zh_TW.properties

del ApplicationResources_zh_TW.properties.big5

del *.bak.bak

???????
???????
运行code.bat之后,可看到目录下多出了两个资源文件,即:ApplicationResource
??????? s_zh_CN.properties
ApplicationResources_zh_TW.properties。其中Applicatio
??????? nResources_zh_CN.properties
的内容是经过编码的,内容如下:

UserForm.userName = "u7528"u6237"u540d

UserForm.password = "u5bc6"u7801

???????
???????
jsp页面中,可以通过Struts的自定义标签来获取资源文件的某个键(例如:User
??????? Form.userName
)的信息。示例如下:

<bean:message key="UserForm.userName"/>

?? **************************************************************/


?? 1.
检索和用户请求匹配的Actionmapping(文件配置在struts-config.xml文件中),对于一个表单在文件中需要实现如下配置

????? <!-- 配置表单实体 -->
????? <form-beans>
<form-bean name="loginForm" type="com.youcompany.forms.LoginForm" />
????? </form-beans>
?????
属性介绍:
????? name="loginFrom"
对应JSP页面表单的name属性
????? type="com.youcompnay.forms.LoginForm"
对应该表单的处理类,该类集成strutsActionForm可作验证,类型转换等功能,
?????
负责将form包装成一个form对象

????? <!-- 表单处理及后期转换-->
?? <action-mappings>
????? <action path="/login" type="com.yourcompany.actions.LoginAction"
????? name="loginForm" scope="request" input="/login.jsp" >
?? <forward name="success" path="/menu.jsp"></forward>
?? <forward name="fails" path="/login.jsp"></forward>
????? </action>
?? </action-mappings>

?? 属性介绍
<action>
部分是说明action的属性。Type 指定Action的类名,负责处理此次form表单请求的类
Name
指定Action主力的ActionForm名,与<form-beans >元素的name属性匹配。
Scope
指定ActionForm存在的范围, (request, application)
Input
指定包含客户提交表单的网页,如果ActionFormValidate方法返回错误,则因该把用户
请求转发到这个网页。
Validate
如果取值为true,则表示ActionServlet应该调用ActionFormvalidate方法
Forward
就是Actionexecute方法执行完毕后,把客户请求在转发给相应的页面。


???
总结,对于struts每一个form表单处理, 常见操作是建立如下的package
????
???? com.yourcompany.forms
负责将表单包装成对象
????
???? com.youcompany.action
处理表单,调用其他组件实现业务逻辑,并负责处理之后的返回,显示
????
???? struts-config.xml
配置文件,ActionServlet将检查该配置,并实现流程串接.

2. 如果ActionForm实例不存在, 就创建一个ActionForm对象,把客户提交的表单保存到ActionForm对象中

??? 总结: 自动创建的ActionForm主要实现表单字段的getter,setter方法, 如果表单字段需要转换成各种对象,其中涉及到类型转换的知识:


??? struts
的类型转换:??????


3.
根据配置信息决定是否需要进行表单验证, 如果需要验证, 就调用ActionFormvalidate()方法
????
???? ActionForm
Validate()方法, 这个很简单,你只需要在ActionForm的包装类中重写validate()方法即可,如果验证不成功,请返回


4.
如果ActionFormvalidate()方法返回null或返回一个不包含ActionMessageActionErrors对象,就表示表单验证成功.

5. ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action, 如果Action实例不存在,就先创建这个实例,
???
然后调用Actionexecute方法

6. Actionexecute返回ActionForward对象,ActionServlet在把客户请求转发到ActionForward对象指向到JSP组件.

7. ActionForward对象指向的JSP组件动态生成网页,返回给客户.

第二讲:

helloapp演示例子中掌握:

1. 分析应用需求
2.
实际操作MVCstruts框架.
3.
视图的创建
4.
资源文件application.properties资源文件的配置和作用
5.
数据合法性验证,表单事务逻辑处理
6.
控制器组件HelloAction.java(处理表单)
7.
模型组件: PersonBean.java 实体包装类
8.
模块贡献的java文件: Constants.java
9. web.xml, struts-config.xml
配置
10.
编译,发布


1.
分析应用需求
通常就是你需要实现的业务功能,若注册,登录,订单

2. 实际操作MVCstruts框架.

MVC构成:

M(model) 包含PersonBeanJavaBean组件,提供属性的getter,setter方法,及其他方法
V(view) JSP,
提供界面设置,可直接用html标签,也可以用strutstag-lib
C(controller) HelloAction,
主要做: 1.业务逻辑验证, 2.调用模型组件 3.返回视图组件

配置文件:
struts-config.xml


3.
视图的创建
?? Hello.jsp
代码:
??
???
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ page taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ page taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page taglib uri="/WEB-INF/struts-login.tld" prefix="login" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<html:html locale="true">
<head>
??? <title><bean:message key="hello.jsp.title" /></title>
??? <html:base />
</head>

<body bgcolor="white">
????? <h2><bean:message key="hello.jsp.page.heading" /></h2>
????? <p>
???????? <html:errors/>
????? </p>
?????
????? </login:present>
?????
?????
????? <html:form action="/HelloWorld.do" focus="userName">
?????????? <bean:message key="hello.jsp.prompt.person"/>
?????????? <html:test property="userName" size="16" maxlength="16" /><br/>
?????????? <html:submit property="submit" value="submit"/>
?????????? <html:reset/>
????? </html:form>
????
???? </html:form><br/>
???? <html:img page="/struts-power.gif" alt="Powered by Struts"/>
?????
</body>
</html:html>

解释:

struts标签库的加载
<%@ page taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ page taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page taglib uri="/WEB-INF/struts-login.tld" prefix="login" %>

web.xml 定义标签库代码:
<taglib>
???? <taglib-uri>/WEB-INF/nested.tld</taglib-uri>
???? <taglib-location>/WEB-INF/nested.tld</taglib-location>
</taglib>

<taglib>
??? <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
??? <tadlib-uri>/WEB-INF/struts-bean.tld</tadlib-uri>
</taglib>

<taglib>
??? <taglib-url>/WEB-INF/struts-html.tld</taglib-url>
??? <taglib-location>/WEB-INF/struts-heml.tld</taglib-location>
</taglib>

<taglib>
???? <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
???? <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>

常见JSP标签解析:
<html:errors>: struts
框架产生的错误信息
<html:form>
<html:text>
<bean:message>
<bean:write>

更多标签......

4. 资源文件application.properties资源文件的配置和作用
?? Hello.jsp
页面中使用了<bean:message>标签,这些key对应的就是application.properties里面配置好的信息段, 这些配置对实现
??
国际化有突出意义

?? hello.jsp.title=Hello~A first struts program
?? hello.jsp.page.heading=Hello World!A first Status application
?? ..............


5.
数据合法性验证,表单事务逻辑处理
?? LoginForm.java

?? public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
ActionErrors errors = new ActionErrors();
if( (username == null) || (username.length() < 1)){
?? errors.add("usrename", new ActionMessage("hello.no.username.error"));
?? return errors;
}
return null;
  }

6. 控制器组件HelloAction.java(处理表单)
??? public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
??? HttpServletResponse response) throws IOException, ServletException

??? 所有的表单Action通过验证之后,都会调用execute()方法,
??? ActionMapping:
包含Action的配置信息和struts-config.xml文件中的action元素
??? ActionForm:
包含了用户表单数据信息
??? HttpServletRequest:
当前http请求对象
??? HttpServletResponse:
当前HTTP相应的对象


7.
模型组件: PersonBean.java 实体包装类
??
?? package com.imc.forms;

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;

public class LoginForm extends ActionForm{
private static final long serialVersionUID = 3348342323123L;

private String username;
private String password;
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 void reset(ActionMapping mapping, HttpServletRequest request){
?? this.password = password;
?? this.username = null;
}
??? //
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
?? ActionErrors errors = new ActionErrors();
?? if( (username == null) || (username.length() < 1)){
??? errors.add("usrename", new ActionMessage("hello.no.username.error"));
??? return errors;
?? }
?? return null;
}
}

8. 模块贡献的java文件: Constants.java

??? public final class Constants{
????? public static final String PERSON_KEY = "personbean";
??? }


9. web.xml, struts-config.xml
配置
??
参照上面
?? <message-resource parameter="hello.application" />
??
指定资源文件的路径,也就是指定
?? WEB-INF/classes/hello/application.properties

10. 编译,发布

编辑打包war..


总结: 服务器端执行表单验证流程如下:

1. servlet容器在web.xml文件中寻找<url-pattern>属性为*.do<servlet-mapping>元素
<servlet-mapping>
???? <servlet-name>action</servlet-name>
???? <url-pattern>*.do</url-pattern>
</servlet-mapping>


2. servlet
容器依据以上<servlet-mapping>元素的<servlet-name>属性action,
web.xml文件中寻找匹配的<servlet>元素
?? <servlet>
????? <servlet-name>action</servlet-name>
????? <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
?? </servlet>


3. servlet
容器把请求转发到<servlet-class>, ActionServlet依据用户请求路径HelloWorld.do, struts配置文件中检索
path
属性为/HelloWorldaction元素

<action path="/HelloWorld"
type = "hello.HelloAction"
name = "HelloForm"
scope = "request"
validate = true
input = "/hello.jsp"

4 ActionServlet根据,action元素的name属性, 创建一个HelloForm对象, 把客户提交的表单数据传给HelloForm对象,
再把HelloForm对象保存再scope指定的request返回内


5
由于Action元素的validate属性为true, ActionServlet调用HelloForm对象的validate进行表单验证,事实上validate总是为true,
只要你重写了public ActionErrors validate(ActionMapping mapping, HttpServerRequest request) 都会验证表单

?

  相关解决方案