Struts学习笔记
Struts现在有struts1.X跟struts 2版本
为什么使用struts?
l 建立在MVC这种公认的好的模式上的,Struts在M、V、C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上,有MVC的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;
l 开源项目,得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护并且经受了实战的检验,使其功能越来越强大,体系也日臻完善;
l 其他技术和框架具有很好的整合性。如与Spring,Hibernate等框架的整合;
l 大大提高了开发速度。
框架概念(Framework)
人们用于解决相同或者相似类型问题的方案。
特点:可重用性,可扩展性,可收缩性.
基于请求响应模式的应用Framework的逻辑结构:控制器,业务逻辑层,数据逻辑层
Struts的概念和体系结构
Struts是Apache组织的一个开源项目。主要是采用Servlet和JSP技术来实现的。
Struts是一个基于SunJava EE平台的MVC框架,它采用MVC模式,将MVC模式“分离显示逻辑和业务逻辑”的能力发挥得淋漓尽致
struts工作流程:
1.当服务器启动web应用时,会读取web.xml文件,根据actionServlet的配置会启动这个servlet,创建这个实例时默认会读取web-inf下面的strus-config.xml文件,如果没有这个文件系统会报错启动失败,如果这个配置文件有语法错误,也会启动失败
2.当客户端提交一个以.do为结尾 的请求,应用会将这个请求交给actionServlet处理如果没有一个action元素的path属性与这个请求的路径相同,就会报No action config found for the specifiedurl.
3.如果找到了对应的action元素,那么如果请求带有表单,就会查找action的name属性如果name属性没有配置,会报错:Form bean not specified on mapping for action:"/loginAction"
如果name属性有配置,根据这个属性值找form-bean元素,将创建这个bean,将请求的参数设置到这个bean中如果这个action配置了validate属性,那么就会对这个form-bean进行验证
验证失败,直接返回input属性指定资源如果验证成功,就会根据type属性找到这个属性对应的类的实例(如果没找着,会创建),然后调用execute方法
4.根据这个execute方法返回的forward的path属性打开对应的资源
下载安装Struts文件,里面有JAR包(lib)、源码(src)、例子(apps)、文档(docs)等。
实践步骤:搭建环境、建立ActionForm、建立Action、页面访问。
搭建Struts环境:
准备:因为项目要频繁用到一些JAR包,所以我们可以把一些常用的JAR包放到一个库里面
Preferences—>Java—>BuildPath—>User Libraries—>New—>填上库名称—>OK—>选中刚刚建立的库名称—>Add JARs—>添加JAR文件—>打开—>【如果想看到源文件则选中JAR文件点前面的小三角,在下面选择Source attachment,双击弹出窗口,如果你的文件是压缩文件则选择External File,如果你的文件在文件夹里则选择External Folder,找到之后OK此时源文件就进来了】—>OK
1. 建立一个动态项目
File—>New—>Dynamic Web Project
2. 导入之前准备环节做的库文件
项目名右击—>Build Path—>Libraries—>Add Library—>User Library—>在库名称前面打勾—>Finish—>OK
3. 为了不要把一些JAR文件复制到WEB/LIB目录下,我们可以做如下操作
项目名右击—> Preferences—>Deployment Assembly—>Add—>Java Build Path Entries—>Next—>选择之前建的库文件—>Finish—>OK
4. 配置web.xml
因为ActionServlet是一个标准的Servlet所以我们要在web.xml里面去配置它该Servlet用于拦截所有的HTTP请求。因此,应将该Servlet配置成自启动Servlet,即为该Servlet配置load-on-startup属性
<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>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
5. 建立并配置struts-config.xml文件
<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEstruts-configPUBLIC
"-//Apache Software Foundation//DTD StrutsConfiguration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name=" " type=" "></form-bean>
</form-beans>
<action-mappings>
<action path=" "type=" " name=" " validate="" parameter=" " input=" "></action>
</action-mappings>
</struts-config>
每一个actionForm类,要有一个form-bean元素配置它,这个form-bean元素最后是在execute方法中的form参数,这个元素是告诉struts如何创建这个bean,name属性指定所创建的bean引用名称,type属性指定要创建的bean的类全名称
每一个action类,有一个action元素与它相对应,这个action元素的配置会被框架封装到mapping中,path属性决定了使用什么路径来访问这个action, name属性是指定与这个action关联的表单名称,它引用的是form-bean元素的name属性,type属性指定处理这个请求的action类的全名称
经过上面五步,Struts的环境就已经搭建好了。下面我们来写一个注册页面,页面中只包含两个表单域:userName和userPwd。首先来建立一个ActionForm
用户注册JSP页面
建立ActionForm
配置ActionForm,必须包含ActionForm 类才行。Struts 要求ActionForm 必须继承Struts 的基类: org.apache.struts.action.ActionFormo ActionForm 的实现非常简单,该类只是一个普通的JavaBean,只要为每个属性提供对应的setter 和getter 方法即可。
根据前面的讲解, ActionForm 用于封装用户的请求参数,而请求参数是通过JSP 页面的表单域传递过来的。因此应保证ActionForm 的参数与表单域的名字相同。
页面中每一个form表单,在Struts框架中应该有一个对应的ActionForm子类
这个子类的每个属性与表单中的每个输入元素的property属性值相同
这个子类应该是一个标准的javaBean
ActionForm的配置
所有的ActionForm 都被配置在struts-config.xml文件中,该文件包括了一个
form-beans的元素,该元素内定义了所有的ActionForm,每个ActionForm 对应一个
form-bean元素。需要继承org.apache.struts.action.ActionForm
为了定义LoginForm. 必须在struts-config.xml文件中的<form-beans>中增加如下代码:
<form-beans>
<form-beanname="loginForm"type="com.jason.form.LoginForm"></form-bean>
</form-beans>
建立Action
exetute方法是每一个请求进来后,就会调用这个方法一次
参数mapping是封装了strutus-config.xml文件中的action元素的配置
form是mapping中name属性相关联的表单对象,封装了用户提交的表单参数
如果用户没有提交表单,这个form就是null,如果有的话就要将form转成对应的类型
需要继承org.apache.struts.action.Action并覆盖execute方法
Action 的配置
Action 需要配置如下几个方面。
•path: ActionServlet 根据该属性来转发用户的请求,即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do后缀去掉,匹配Action 的path属性值。
• name:此处的name 属性并不是Action 本身的名字,而是与Action 关联的ActionForm。因此该name 属性必须是 前面存在的ActionForm 名。
• type:该属性用于指定Action 的实现类,也就是负责处理用户请求的业务控制器。
·局部Forward: Action 的转发并没有转发到实际的JSP 资源,而是转发到逻辑名,即Forward 名。在Action 内配置的Forward 都是局部Forward (该Forw缸d 只在该Action 内有效)。
下面是该Action 的配置代码:
<action-mappings>
<action path="/login"
type="com.jason.action.LoginAction"
name="loginForm">
<forwardname="welcome"path="/welcome.jsp"></forward>
</action>
</action-mappings>
配置Forward
正如前面所讲, Forward 分局部Forward和全局Forward 两种。前者在Action 里配置,仅对该Action 有效;后者单独配置,对所有的Action 都有效。配置Forward 非常简单,主要需要指定以下三个属性。
• name:该Forward 的逻辑名。
• path:该Forward 映射到的JSP 资源。
• redirect:是否使用重定向。
局部Forward 作为Action 的子元素配置;全局Forward配置在global-forwards 元素里。
下面是配置全局Forward的代码:
<global-forwards>
<forwardname="welcome"path="/welcome.jsp"></forward>
</global-forwards>
当每个Action在转发时,首先在局部Forward 中查找与之对应的Forward,如果在局部Forward 中找不到对应的Forward 对象,才会到全局Forward 中查找。因此,局部Forward 可以覆盖全局Forward。