最近在课余时间学习了一下Java web开发的技术,主要包括三大框架struts,hiberate,spring,ajax等技术。
现将一些struts框架的一些基础知识总结如下:
Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,主要由一系列的框架类、辅助类和定制的JSP标记库构成。开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间。
Struts 2框架的特点:
-
POJO表单和POJO动作 - Struts2的Struts框架已经摆脱了动作表单组成部分, Struts2可以使用任何POJO接收的形式输入。同样现在可以看到任何POJO作为一个Action类。
-
标签支持 - Struts2中,提高了表单标签和新标签允许开发人员编写更少的代码。
-
AJAX 支持- Struts2中已确认由Web2.0技术接管,并整合到产品中,通过创建AJAX标签,功能非常相似的标准Struts2 标签AJAX支持。
-
易于整合 - Struts2 集成各种整合与其他框架如Spring,Tiles 和SiteMesh是现在更容易。
-
模板支持 - 支持生成使用模板。
-
插件支持 - 可以提高核心Struts2的特性,并增强使用插件。大量的插件可供Struts2。
-
性能分析 - Struts2的分析,调试和分析应用程序提供了集成。除此之外,Struts还提供了集成的内置调试工具调试。
-
易于修改标签 - Struts2的标签标注,可以调整使用Freemarker的模板。这并不需要JSP或Java知识。基本HTML,XML和CSS知识是足够修改标签。
-
提倡少配置 - Struts2 促进较少的配置的帮助下,使用默认的各种设置值。不必配置的东西,除非它不符Struts2的默认设置。
-
视图技术: - Struts2中有一个很大的支持多个视图选项 (JSP, Freemarker, Velocity 和 XSLT)
Struts2 体系结构
在Struts2的模型 - 视图 - 控制器模式,实现以下五个核心部件:
-
Actions
-
Interceptors
-
Value Stack / OGNL
-
Results / Result types
-
View technologies
-
-
首先,控制器(ActionServlet)进行初始化工作,读取配置文件(struts-config.xml),为不同的Struts模块初始化相应的ModuleConfig对象。比如配置文件中的Action映射定义都保存在ActionConfig集合中。相应地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。
-
Struts框架的处理流程清楚的体现了MVC系统的特点,所有的页面请求都将发送到Struts的前端控制器ActionServlet中(因此如果要进行前置处理,可以继承ActionServlet并重写process()方法),同时ActionServlet也将根据struts-config.xml配置文件中的设置(<action>标签)来决定转向到那个后端控制器Action类。
-
当页面中的Form表单被提交时,ActionForm将自动地封装和处理该Form表单中的数据。同时在Action的子类中可以存取存储在ActionForm中的Form表单数据。
-
Action的子类将处理所获得的存储在ActionForm中的Form表单数据,处理和响应客户请求,它还调用后台的JavaBean组件完成具体的业务逻辑。同时也按照在struts-config.xml文件内的forward标签内容(如<forward name="sayHello" path="/sayHello.jsp"/>),将结果交由某个JSP页面显示。
Struts开发的步骤:
【第1步】 安装Struts2
Struts2的入口点是一个过滤器(Filter)。因此,Struts2要按过滤器的方式配置。下面是在web.xml中配置Struts2的代码:
【第2步】 编写Action类<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>Struts2.x的动作类需要从com.opensymphony.xwork2.ActionSupport类继承。动作类的一个特征就是要覆盖execute方法,Struts2的execute方法没有参数。
【第3步】 配置Action类
在struts2.x中的配置文件一般为struts.xml,放到WEB-INF"classes目录中。下面是在struts.xml中配置动作类的代码:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2"namespace="/mystruts"
extends="struts-default">
<action name="sum"class="action.FirstAction">
<result name="positive">/positive.jsp</result>
<result name="negative">/negative.jsp</result>
</action>
</package>
</struts>在<struts>标签中可以有多个<package>,第一个<package>可以指定一个Servlet访问路径(不包括动作名),如“/mystruts”。extends属性继承一个默认的配置文件“struts-default”,一般都继承于它,大家可以先不去管它。<action>标签中的name属性表示动作名,class表示动作类名。
<result>标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”,就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。在<struts>中可以有多个<package>,在<package>中可以有多个<action>。
【第4步】 编写用户录入接口(JSP页面)
这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。
<s:property>用法
1,访问Action值栈中的普通属性:
<s:property value="attrName"/>
2,访问Action值栈中的对象属性(要有get set方法):
<s:property value="obj.attrName"/>
<s:property value="obj1.obj2.attrName"/>
3,访问值栈中对象属性的方法
<s:property value="obj.methodName()"/>
4,访问值栈中action的普通方法:
<s:property value="methodName()"/>
5,访问静态方法:
<s:property value="@com.softeem.LoginAction@methodName()"/>
2:
处理一个form多个submit
Struts2 Action类需要实现一个Struts2自带的拦截器来获得request对象,拦截器如下:
org.apache.struts2.interceptor. ServletRequestAware。
3:struts.xml常用配置解析
在Struts2中提供了一个默认的struts.xml文件,但如果package、action、interceptors等配置比较多时,都放到一个struts.xml文件不太容易维护。因此,就需要将struts.xml文件分成多个配置文件,然后在struts.xml文件中使用<include>标签引用这些配置文件。框架中的模型(M)、视图(V)、控制器(C) 三个部分是通过struts-config.xml配置文件将其联系在一起。一个标准的struts-config文件包含如下结构,有一点要引起大家的注意的,就是,struts-config.xml中配置的各个项目是有一定的顺序要求的,几个主要项目的顺序大致是这样的:
4:在Action类中获得HttpServletResponse,Request对象
【方法1】使用Struts2 Aware拦截器
【方法2】使用RequestAware拦截器(用的少),动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。
【方法3】使用ActionContext类;通过org.apache.struts2.ActionContext类的get方法获得相应的对象。
【方法4】使用ServletActionContext类;truts2为我们提供了一种最简单的方法获得HttpServletResponse及其他对象。这就是org.apache.struts2.ServletActionContext类。我们可以直接使用ServletActionContext类的getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象。
5:拦截器概述
Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口继承,在Intercepter接口中有如下三个方法需要实现:
◆ voiddestroy();
◆ voidinit();
◆ Stringintercept(ActionInvocationinvocation)throwsException
其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:
<package name="demo" extends="struts-default" > ... </package> 在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。这个默认的拦截器引用如下:
<default-interceptor-refname="defaultStack"/>
<interceptor-stackname="defaultStack"> <interceptor-refname="exception"/> <interceptor-refname="alias"/> <interceptor-refname="servletConfig"/> <interceptor-refname="prepare"/> <interceptor-refname="i18n"/> <interceptor-refname="chain"/> <interceptor-refname="debugging"/> <interceptor-refname="profiling"/> <interceptor-refname="scopedModelDriven"/> <interceptor-refname="modelDriven"/> <interceptor-refname="fileUpload"/> <interceptor-refname="checkbox"/> <interceptor-refname="staticParams"/> <interceptor-refname="params"> <paramname="excludeParams">dojo..*</param> </interceptor-ref> <interceptor-refname="conversionError"/> <interceptor-refname="validation"> <paramname="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-refname="workflow"> <paramname="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
上面在defaultStack中引用的拦截器都可以在<action>中不经过引用就可以使用(如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的拦截器,也需要在<action>中重新引用,在后面将详细讲解)。
由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2是会自动执行相应的setter方法的。
当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:<action name="first" class="action.FirstAction">
... ...
</action>
<s:formaction="first"namespace="/test">
<s:textfieldname="name"/>
<s:submit/>
</s:form>
<actionname="first"class="action.FirstAction">
<interceptor-refname="timer"/>
<interceptor-refname="params"/>
</action>
-
-
Struts与其它框架的不同
在Struts应用中,有一个称为ActionServlet的主调度程序(或称为分配器)。不过,并非所有的请求都必须通过ActionServlet(以“*.do”结尾的URL都是Struts请求)。用户的请求目标可以是非Struts的页面,也可以是那些使用了Struts标记库但不使用Struts请求分配服务的页面。这正是Struts体系的优点之一:按需使用。许多编程框架要求你要么不用,要么全部使用,而且一旦你决定使用,以后要悔改从前的错误就会付出高昂的代价。Struts按需使用的优点与这类系统形成了强烈对比。