Struts快速入门
一、Struts快速入门案例
为什么要学习Struts呢?因为Web层jsp页面调用servlet过于繁琐,Apache组织开发了一套针对web层简化操作的框架,可以简化Web层的操作。
首先,我们了解了为什么要学习Struts后,我们先来用上Struts框架实现用户注册页面。
1、编写一个注册页面
2、把表单的注册请求交给struts处理
3、导入struts开发环境
(1)导入struts开发包
(2)在web.xml文件中配置struts处理所有.do的请求
<servlet>
<servlet-name>ActionServlet</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
4、在web-inf中加入struts的配置文件
<?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="userForm" type="cn.itcast.web.formbean.UserForm"></form-bean>
</form-beans>
<action-mappings> <!-- 将以下配置信息自动封装进actionMapping对象 -->
<action path="/register" type="cn.itcast.web.action.RegisterAction" name="userForm">
<forward name="message" path="/message.jsp"></forward>
</action>
</action-mappings>
</struts-config>
5、编写封装表单数据的formbean
6、编写处理请求的action
7、根据struts配置,进行转发请发
在配置文件
Struts-config.xml 中配置
<action path="/RegisterUser" type="cn.ysp.web.action.RegisterUser" name="UserFormBean">
<forward name="success" path="/success.jsp"/>
<forward name="failure" path="/success.jsp"/>
</action>
因此在程序中只用调用ActionMapping对象的实例调用其findForward(“name”)方法,实现转发
ActionForward forward = new ActionForward(“/success.jsp”);
Return forward;
下面是Struts对Web层进行封装数据,简化数据的大概流程图:
二、Struts工作流程
(1) Struts的控制器组件主要包括
ActionServlet对象:Struts 的核心类
RequestProcessor对象:由ActionServlet调用,负责处理用户请求
Action对象:用户自己编写的类
(2) Struts处理请求的流程:
当 ActionServlet 接收到 HTTP 请求后,在 doGet 或 doPost 方法中都会调用process()方法处理请求
在 ActionServlet 的 process() 方法中一旦选择了正确的子应用模块,就会调用RequestProcessor实例的process()方法来处理请求。在ActionServlet调用这个方法时,会把当前的request和response对象传给它
RequestProcessor实例的process()方法调用ProcessActionCreate()方法,先判断是否在 Action 缓存中存在Action实例,如果不存在,就创建一个Action实例,把它保存在 Action 缓存中
RequestProcessor实例的process()方法调用Action实例的execute()方法
三、Struts配置中的常用属性
path=“/register“ ------> 指定action处理的地址
type=“cn.itcast.RegisterAction"
------> 指定处理请求的Action的完整类名
name=“userFormBean“ ------->指定使用哪个formbean封装请求参数
scope="request" ------>指定把formbean存放到哪个域对象中,默认session
attribute=“myformbean"
------>指定formbean存储的key,不设默认为name属性的值
input="/register.jsp"
------>指定formbean的数据是由哪个页面提供的,提供此属性的目的在于formbean校验失败时,程序方便跳回formbean的输入页面,显示校验失败信息。
forward=“welcome.jsp“
----->指定收到请求时,跳转到相应的jsp页面,如果配置了此属性,则action将不再被调用。
include="welcome.jsp"
------>指定收到请求时,进行页面包含。
unknown= “true"
------>如果action把该属性设置为true,则它可以处理客户机发出的所有无效的.do请求,默认值为false
parameter=“method”
------>配置action参数,调用actioMapping.getParameter方法可以获得这里配置的参数。
classname=“”
------>
<action>标签和所有的配置信息使用哪个对象封装,默认值为ActionMapping对象。
validate="true"
------>请求参数封装到formbean中后,是否让struts自动调用formbean的validate方法进行数据校验。默认true
<forward name="hello" path="/success.jsp"/>------>Struts请求转发
四、Struts进行表单校验
校验:
1、表单数据提交后,在服务器端编程校验数据合法性,是一个很常见的需求。所以struts的ActionServlet在把数据封装到formbean后,会自动调用formbean的validate方法对数据进行校验,并根据validate方法的返回值,决定转发到哪个jsp页面处理。
2、 Sturs的这种处理方式,可以让开发人员少死点脑细胞,开发人员只需要在validate方法中写代码进行数据校验就OK了,调用方法的事由struts的actionServlet去做了,并且,调用方法完后,如果有错误,跳转的事,也由struts根据配置文件做了。
3、 注意:若想struts的actionServlet把数据封装到formbean后,调用其validate方法,需要在struts-config.xml文件中把action的validate属性设置为true,默认值为true。
Struts调用formbean.validate方法后,其规则为:
(1)如果validate返回的ActionErrors对象为空或null,则Struts认为表单验证通过,struts进而继续调用Action处理请求。
(2)如果validate返回的ActionErrors不为空,并且封装了数据,则认为校验失败,Struts将自动跳转回表单输入页面。(input属性指定)
因此用户若想校验失败,只需要创建ActionErrors对象,并调用其方法:
ActionErrors.add(String key,ActionMessage message)
例:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if(isEmpty(this.username)){
addMessage(errors, "username", "用户名不能为空");
}else{
if(!this.username.matches("[A-Za-z]{3,6}")){
addMessage(errors, "username", "用户名要是3-6位");
}
}
return errors;
显示校验信息:
Struts在收到Formbean的返回值ActionErrors后,会将其存储到request域中,进而带给表单页面,以便开发人员在表单页面中显示校验失败的错误信息(这点建议读读struts的源码)。
1)在JSP页面中开发人员可以编码显示错误信息:(手工获取)
1>注意上面的代码取request的errors对象时为什么用“org.apache.struts.action.ERROR”,这个值从何来?
2>显示消息时有可能需要在struts-config.xml文件中配置一个资源文件
<message-resources parameter="MessageResource"/>
2)使用Struts的html标签获取错误信息
在JSP页面中手工编码获取errors对象中保存的数据很麻烦,因此Struts编写了<html:errors>标签,它用于封装JSP页面中用于获取消息的java代码。
用户使用<html:errors>标签可以很轻松获取到errors中保存的校验信息,示例。
<html:errors>标签也可以以ActionMessage中封装了key为关键字,从资源文件中检索数据予以显示,如下所示:
注意:1>html:errors标签在显示ActionMessage封装的消息时,将以ActionMessage的key为关键字从资源文件中检索数据显示
2>errors标签工作时需要资源文件
ActionMessage封装消息的方式很灵活,后面两个构造函数中的value参数,用于替换消息文本中的占位符:
以下是往Actionmessage对象中封装消息的代码示例:
五、Struts进行数据回显
Struts提供了很多表单相关的自定义标签,如:
<html:text>
<html:radio>
<html:select>
<html:option>
<html:checkbox>
<html:multibox>
<html:textarea>
……
这些标签除用于生成相应的html标签外,最大的好处在于它在产生html标签时,会自动检索相应formbean的数据予以显示,这样,当表单校验失败时,表单数据的回显struts帮我们干了,开发人员就不需要再编码去取了。
使用Struts的html标签完成数据回显时注意的问题:
html标签回显数据时,会以org.apache.struts.taglib.html.BEAN为关键字,从各个域中查找bean,找不到则抛空指针异常。所以使用html标签时域中须有以org.apache.struts.taglib.html.BEAN为关键字的对象。
这个工作可以交给html:form标签做,html:form标签在执行时,会查找域中已有的formbean,并以org.apache.struts.taglib.html.BEAN为关键字把formbean存在域中。
如果html:form标签在域中找不到formbean,则html:form标签会实例化一个空bean,然后存储到域中。因此,为了在页面中使用struts的html标签回显数据,这些标签需要配合html:form标签使用。(查看html:form标签的源文件可以看到这点)。
对于复选框中的数据,Html:checkbox标签不能完成数据回显,复选框的数据回显需要使用html:multibox。
Struts中的html:password标签也会回显数据,如果不想password回显,需要把其redisplay属性置为false。
补充:formbean的reset方法