【前言】
记录一下以前写的struct2的读书笔记
【内容】
1、启动一个struts2应用的时候,3种配置文件的加载顺序如下:struts-default.xml(包含在Struts2-core.xml文件中)struts-plugin.xml(包含在各插件的JAR文件中)struts.xml(应用相关的配置文件)也就是说应用相关的配置文件总是最后才加载的,因为应用可以依赖于插件,每个插件都可以依赖于Struts2的核心,但是插件之间不可以互相依赖
2、jsp页面可以通过${applicationScope.attribute}${sessionScope.attribute}${requestScope.attribute}等方式直接获取对象里面的属性。
3、Struts2实现下面接口的Action可以直接访问Web应用的ServletContext实例ServletResquestAware-->可以直接访问用户请求的HttpServletRequestServletResponseAware-->可以直接访问服务器响应的HttpServletResponse实例
4、为了直接访问Servlet API,Struts 2提供了一个ServletActionContext类,该类包括下面几个静态方法:static PageContext getPageContext():获得Web应用的PageContext对象static HttpServletRequest getRequest();static HttpServletResponse getResponse();static ServletContext getServletContext();
5、定义<action .../>的name时候,如果允许Action name出现斜线(/),必需先设置(struts.properties):struts.enable.SlashesInActionNames=ture
6、<action.../>默认的处理逻辑的方法是:execute()方法,但可以通过method="methodName"属性改变,如<action name="login" class="test.login" method="validate" />则提交处理改Action的方法不再是execute,而是validate()方法
7、6是用显示的方法使一个action可以有多个方法处理多个逻辑。也可以通过匹配的方式达到这种效果,如下:<action name="*action" class="test.login" method="{1}">*action可以匹配多个action,比如Loginaction--->*匹配了LoginRegisteraction-->*匹配了Register而method="{1}",这里的1指的是第一个匹配的字符串所以Loginaction对应的逻辑会有一个Login的方法处理,Registeraction对应的逻辑会有一个Register方法处理。
8、struts 2允许<result.../>使用表达式,如下:<action name="*"> <result>/{1}.jsp</result></action>
9、当用户请求的URL在容器找不到对应的Action时,系统将使用默认的Action处理用户请求,配置默认的Action通过<default-action-ref.../>元素来完成:<default-action-ref name="defaultAction" ><action name="defaultAction" class="test.default.action" ><result .../></action>
10、默认情况下,用<result .../>都是dispatcher结果,表示将请求Forward到指定的JSP资源可以用type参数知道结果类型,比如:<result type="redirect">/test.jsp</result>表示重定向到test.jspredirect-action结果类型也表示重定向,只是重定向到的不是jsp页面,而是action。
11、<result.../>跳转还可以使用${属性}的方式指定视图资源,如下:<action name="myaction" class="test.myaction"> <result name="success">/${target}.jsp</result></action>如果myaction的target值为test,则当返回success时,跳转到.test.jsp页面。
12.某些变量从数据库提取出来,包含了特殊字符,比如&,如果直接用<s:property />显示在页面,&会被转义为&,为了防止这种情况,可以添加<s:property />的属性:escape='0',这样输出就不会被转义。<s:select />标签是没有这个属性的,不过可以嵌套<s:property />
JavaBen是一些符合设计模式要求的java类。定义两个方法来存取bean的数据,Accessors(getter)读,Mutator(setter)写。ActionServerlet自动调用setter方法。
jsp用来显示页面,jsp tag用来格式化数据,Action负责收集数据和转发。
开发框架:是一个可重用的,大致完成的应用程序。可以通过对其进行定制生成一个客户需要的真正的应用程序。提供给程序员骨干模块,可重用。
一般而言Web应用程序的架构的主要目的是帮助你从浏览器获取数据并把它传给自己的应用程序进行处理。简而言之就是在浏览器应用程序之间传递数据。
一般程序的开发遵循MVC架构,jsp负责处理表现层,JDBC处理Model层,struts则用来处理Control层。
Struts采用Model2体系结构。它主要由ActionForward/Hyperlink(向哪去?目的地)、ActionForms/HtmlForms(有什么数据)、ActionClass/CustomActions(做什么了?做了向哪去呢?)组成。ActionServerlet负责控制流程,JSP处理表现层,Action负责业务逻辑。当ActionServerlet从容器中获取一个请求时,它用请求的URI(路径)来决定是哪一个Action来处理这个请求。一个Action可以检验输入的合法性、通过业务逻辑层来读取数据库或其它数据服务中的信息。ActionForm是一个输入bean,用来包含输入的数据。ActionServerlet通过查看求路径来决定是哪个ActionForm包含输入数据。
structs2.0 学习 (2008-12-17 12:00)
分类: structs2.0
OK,昨天研究了一下与AJAX的关系今天继续学习它们 之间的关系 吧!
大家知道Struts 2 的AJAX 标志是基于Dojo控件开发的,所以如果大家希望熟练地使用这些标志,最好去了解一下Dojo。
学习JS的一个新框架原理吧!
本文将介绍在Struts 2中使用DWR实现AJAX表单校验。
DWR(Direct Web Remoting)是在Java EE中较流行的AJAX框架,它的最大优势就是可以像使用本地的Javascript函数一样,调用服务器上的Java方法。如下图所示:
其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个 Servlet的作用就是初始化要暴露给Javascript调用的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript 类代码。在XHR请求到来的时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为 Javascript代码。详情请参考:http://getahead.ltd.uk/dwr/
在Struts 2.0.x中使用DWR实现AJAX表单校验。在大家掌握了DWR的原理后,下面我想详细介绍一下实现的步骤。
首先,到以下站点下载DWR的1.1.4版本的JAR包。需要注意的是,DWR虽然已经发布2.0版本,但它与1.1.4有很大的区别,所以请大家不要使用2.0版本,否则会出现异常的;
接着,新建WEB工程,将下图所示的JAR包加入到工程的“Build Path”中;
可以到上面的网址下载到所需的包的哦!
第二步配置web.xml文件,作全局的XML配置处理
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" 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/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts 2 AJAX Part 3</display-name>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 开始DWR配置 -->
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<!-- 结束DWR配置 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
需要配置XML文件中的DWR的哦!
[如果需要新的些功能的JAR包进来的话就需要配置处理一下这个XML文件哦!]
这个里面需要DWR所 以就可以需要配置处理一下
<!-- 开始DWR配置 -->
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
第三步:写DWR的配置文件
清单2 WebContent/WEB-INF/dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: dwr -->
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="validator">
<param name="class" value="org.apache.struts2.validators.DWRValidator"/>
</create>
<convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/>
</allow>
<signatures>
<![CDATA[
import java.util.Map;
import org.apache.struts2.validators.DWRValidator;
DWRValidator.doPost(String, String, Map<String, String>);
]]>
</signatures>
</dwr>
<!-- END SNIPPET: dwr -->
注意好配置的顺序处理:先导入JAR文件然后导入web.xml之后开始配置好dwr.xml文件之类的哦!
通过以上配置,我们可以将DWRValidator中的方法暴露为Javascript可以调用的远程接口。
第四步:开始写Action类方法了哦!
接下来,我们要开始编写Action类了,代码如下:
package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class AjaxValidation extends ActionSupport {
private static final long serialVersionUID = -7901311649275887920L;
private String name;
private String password;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() {
return SUCCESS;
}
}
第五步:再来写一个配置文件
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<validator type="regex">
<param name="fieldName">password</param>
<param name="expression">
<![CDATA[(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$]]>
</param>
<message>Password must be between 8 and 10 characters, contain at least one digit and one alphabetic character, and must not contain special characters</message>
</validator>
<field name="name">
<field-validator type="requiredstring">
<message>You must enter a name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">127</param>
<message>Age must be between 18 and 127</message>
</field-validator>
</field>
</validators>
清单4 src/tutorial/AjaxValidation-validation.xml
对于AjaxValidation类的name、password和age三个字段,我分别用了非空、正规表达式和范围验证。正规表达式(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$的作用是保证密码由至少包括一个数字和一个字母,且不能含有符号的长度为8到10的字符串组成。它也是所谓强密码(Strong Password)的普通实现。
接下来的是JSP的代码,内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Struts 2 AJAX - Validation</title>
<s:head theme="ajax" />
</head>
<body>
<h2>
AJAX Validation Using DWR
</h2>
<s:form method="post" validate="true" theme="ajax">
<s:textfield label="Name" name="name" />
<s:password label="Password" name="password" />
<s:textfield label="Age" name="age" />
<s:submit />
</s:form>
</body>
</html>
清单5 WebContent/AjaxValidation.jsp
以上代码也不复杂,不过需要的是注意的是除了要加入<s:head theme="ajax" />外,<s:form />也必须加入validate="true" theme="ajax"的属性。
最后是Struts 2的配置文件,内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="Struts2_AJAX_DEMO" extends="struts-default">
<action name="AjaxValidation" class="tutorial.AjaxValidation">
<result name="input">AjaxValidation.jsp</result>
<result>AjaxValidation.jsp</result>
</action>
</package>
</struts>
现在来写struts.xml的配置文件。
其实就这几步份哦。
要知道写XML配置文件加上Action就可以了哦!
[感觉到了JAVA确实是对XML的强大支持哦哈哈!]强了!
1.为Structs应用配置Web.xml文件
第一步:配置ActionServlet
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.appache.structs.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<uri-pattern>*.do</url-pattern>
</servlet-mapping>
注意:不管应用中包含多少个子应用,都只需配置一个ActionServlet,因为ActionServlet支持多线程,目前的Structs框架只允许在应用中配置一个ActionServlet。
第二步:初始化参数对Servlet的运行环境进行初始化配置。
<servlet>
<servlet-name> action</servlet-name>
<servlet-class> org.appache.structs.ActionServlet </servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/structs-config.xml</param-value>
</init-param>
</servlet>
表2-1. Struts1.1中用到的初始化参数
参数名 含义/默认值
config 以相对路径的方式指明Struts应用程序的配置文件位置。如不设置,则默认值为/WEB-INF/struts-config.xml。
config/sub1 以相对路径的方式指明子应用程序的配置文件位置,一般来说,很少用到子应用程序,在此不多描述。
debug 设置Servlet的debug级别,控制日志记录的详细程度。默认为0,记录相对最少的日志信息。
detail 设置Digester的debug级别,Digester是Struts框架所使用的用来解析xml配置文件的一个框架,通过该设置,可以查看不同详细等级的解析日志。默认为0,记录相对最少的日志信息。
第三步:配置欢迎清单
当客户访问Web应用时,如果仅仅给出Web应用的Root URL,没用指定具体的文件名,Web容器会自动调用Web应用的欢迎文件。
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-fiel-list>
说明:<welcome-file-list>可以包含多个<welcome-file>子元素,首先查找第一个<welcome-file>文件。
由于<welcome-file-list>元素中不能配置Servlet映射,因此不能直接把Structs的Action作为欢迎文件,可以采用一种变通的方法来实现在欢迎文件中调用Structs Action。首先,在Structs配置文件中为被调用的Action创建一个全局的转发项,例如:
<global-forwards>
<forward name=”welcome” path=”HelloWord.do”/>
</global-forwords>
创建一个welcome.jsp的文件
最后在web.xml文件中把welcome.jsp文件配置为欢迎文件,代码如下:
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list>
第四步:配置错误处理
<error-page>
<error-code>404</error-code>
<location>/commom/404.jsp</location>
</error-page>
<error-page>
<error-code>505</error-code>
<location>/commom/505.jsp</location>
</error-page>
也可以为Web容器捕获的Java异常配置<error-page>,需要设置<exception-type>子元素,它用于指定Java异常类。Web容器可能捕获如下异常:
RuntimeException或Error ServletException或它的子类 IOException或它的子类
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/common/system_ioerror.jsp</location>
</error-page>
第五步:配置Structs标签库
使用客户化的标签库,要配置它们
<taglib>
<tag-uri>/WEB-INF/structs-html.tld<tag-uri>
<taglib-location>/WEB-INF/structs-html.tld</taglib-location>
</taglib>
<tag-uri>用于指定标签库的相对或者绝对URI地址,Web应用根据这一URI来访问标签库。
<taglib-location>指定标签描述文件在文件资源系统中的物理位置。
2.Structs配置文件
Structs框架在启动时会读入其配置文件,根据它来创建和配置各种Structs组件。
1<Structs-config>元素
<structs-config>元素是Structs配置文件的根元素,<structs-cofig>元素有8个子元素。它的DTD定义如下:
<!ELEMENT structs-config(data-sources?,formbean?,global-exeception?,global-forward?,action-mapping,controller?,message-resources*,plug-in*)>
在Struts配置中,必须按照以上的DTD指定的先后顺序来配置<Structs-config>元素的各个子元素,如果颠倒了这些元素的配置文件中的位置,在Structs应用启动时会生成错误。
<data-sources>元素
<data-sources>元素包含零个、一个或者多个<data-sources>子元素,<data-sources>用于配置特定的数据源,它可以包含多个<set-property>子元素,用于设置数据源的各种属性。
。。。
配置了数据源后,就可以在Action类中访问数据源,在org.apache.structs.action.Action类中定义了getDataSource(HttpRequrst)方法,它用于获取数据源对象的引用。
DataSource dataSource;
Connection connection;
dataSource =getDataSource(request);
connection=dataSource.getConnection();
也可以在配置文件中声明多个数据源,此时需要为每一个数据源分配唯一的key值,通过改值来标识特定的数据源。
2<form-beans>元素
<form-beans>元素用来配置多个ActionForm Bean,<form-beans>包含多个<forom-bean>子元素,,每个<from-bean>包含多个属性,ClassName , name,type
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
</form-beans>
注意:配置动态ActionForm Bean,还必须配置<form-bean>元素的<form-property>元素。
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
<form-bean name="userForm" type="org.apache.structs.action.DynaAction">
<from-property name="firstname" type="java.lang.String"/>
<form-property name="secondname" type="java.lang.String">
<form-property name="age" type="java.Integer" initial="18">
</form-beans>
3<global-exception>元素
<global-exception>用于配置异常处理,<global-exception>元素可以包含零个或者多个<exception>元素。
<exception>元素用来设置java异常和异常处理类org.apache.structs.action,Exception Hander之间的映射。
4<gloable-forwards>元素
<global-forwards>元素用来声明全局的转发关系,<global-forwards>有零个或多个<forward>元素组成。<forward>元素用于把一个逻辑映射到特定的URL
属性 描 述
className 和<forward>元素对应的配置类,默认为org.apache.structs.action.ActionForWard
name 转发路径的逻辑名,此项时必须的
path 指定或者重定向的URI。此项时必须的,必须以”/”开头
redirect 此项是true,表示是执行重定向的操作,此项是false时,表示请求转发。
<global-forwards>
<forward name="forward1" path="/Action1.do"/>
<forward name="forward1" path="/Action2.do"/>
</global-forwards>
如果jsp1.jsp把请求转发给Action1,可以使用以下代码:
<html:link forward=”forward1”>
或者<logic:forward name=”forward1”>
如果Action1的execute()方法把请求转发给JSP2.jsp,可以使用一下代码:
return(mapping.findForward(“forward2”))
5<action-mapping>元素
<action-mapping>元素包含零个或者多个<action>元素。<action>元素描述了从特定的请求路径到相应的Action类的映射。
6<controller>元素
<controller>元素用于配置ActionServlet。
7< message-resources>元素
<message-resources>元素用于配置Resource Bundle,Resource Budle用于存放本地化消息文件。
Structs标签
HTML标签
标签名 描述
base 包装HTML的base元素
button 包装HTML的 button类型的input元素
cancel 包装HTML cancel 按钮
checkbox 包装HTML checkbox 类型的输入域
errors 有条件地显示一些error消息,显示ActionErrors信息
file 包装HTML文件上传输入域
form 定义HTML form 元素
frame 包装HTML frame 元素
hidden 包装HTML hidden 输入域
html 包装 HTML中的 html 元素
image 包装 "image"类型的输入域
img 包装HTML的 img 元素
javascript 包装根据ValidatorPlugIn提供的校验规则所提供的javascript校验脚本
link 包装超链接
messages 有条件地显示一些提示信息,显示ActionMessages信息
multibox 包装多选输入框
option 包装一个选择输入框
options 包装一批选择输入框
optionsCollection 包装一批选择输入框集
password 包装密文输入框
radio 包装单选输入框
reset 包装“重置”功能的按钮
rewrite 包装一个URL
select 包装一个选择输入框
submit 包装一个提交按钮
text 包装一个文本输入框
textarea 包装一个备注输入框
ActionForm
ActionForm 的要求
创建一个ActionForm 并不困难,但是你的类必须符合一些要求:
ActionForm 必须扩展自org.apache.struts.ActionForm。基类ActionForm 是不能实例化的。
ActionForm 必须为每个应该从请求中收集的HTML控件定义一个公共属性。
(Struts 1.0 要求每个属性都要mutator 和accessor 。Struts 1.1 则没有如此严格)
ActionForm还可能要符合一些可选的要求:
如果你要求ActionForm 在传递属性到Action之前校验它们,你就必须实现validate
方法;
如果想在组装前初始化属性,必须实现reset , 它在ActionForm 组装前被调用;
动态ActionForm
ActionForm 作为类型转换器
ActionForm的一个强制点是应该使用String 和boolean属性。实际上,这意味着属性
必须得从一种转换到另一种类型。大部分应用也需要一些属性,比如电话号码或者数量,以
一种格式化的方式出现。核心Java 包提供一些工具来做这种事情,但是要清楚地将他们集
成到应用中仍然是一个挑战。
Struts 开发人员经常在ActionForm中包含helper方法,来进行类型转换。helper 方法
可以有很多种实现方式,这我们在5.6种叙述。
5.2.6 ActionForm 作为防火墙
当请求提交时,ActionServlet 使用一个自动组装机制来从请求参数中设置请求的
ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参数
是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以接
受的能力。ActionForm 一定不能包含看起来像是一个JavaBean 属性,但不能从HTTP 请
求设置的属性方法。
5.3.4 ActionForm 可以嵌套其它bean
因为Struts 标签扩展和自动组装机制都支持点号语法来从ActionForm访问其它
bean。这是一个方便的方式,可以通过ActionForm来组装存在的bean。在JSP 页面, 你可
以象这样引用一个嵌套的bean:
<html:text
propety="values.telephoneText"
size="14"
maxlength="14"/>
5.7.2 分发(Dispatch )
Struts 开发人员通常使用同一个Action处理相关的操作。一个通常做法来选择操作是在HTML表单中使用隐藏属性。BaseForm 的dispatch 属性也可用作这个目的:
public void setDispatch(String dispatch);
public String getDispatch();
Struts 配置提供连个级别嵌套的ActionForward:
Global (全局) ActionForward对整个应用中的所有Action 对象均有效;
Local (局部) ActionForward 则在ActionMapping 元素中定义。仅对那些在这个
ActionMapping中调用的Action对象有效。
从Action 对象内部来看,forward 通常像这样来选择:
ActionForward forward = mapping.findForward("continue");