刚学习struts1整理的笔记附带文档上载

刚学习struts1整理的笔记附带文档下载

Struts1
什么是struts?
Struts是一个按照MVC模式设计出来的web层框架。说笼统一点实际上就是一个大大的Servlet。这个Servlet名为ActionServlet,或者是ActionServlet的子类。我们可以在web.xml文件中将各种符合条件的请求全部交给这个Servlet进行处理。这个Servlet参照一个名为struts-config.xml的文件(通常放在/WEB-INF/struts-config.xml)来对不同请求交给不同的action去处理。
Struts的工作原理一般来说分为八步(当然这是个人看法):
1.读取配置文件(初始化对应的模块)
2.发送请求(提交表单或者超链接)
3.填充FromBean(实例化,复位,填充数据,校验数据)
4.通过struts-config.xml配置信息派发给相应的action
5.Action接受业务并进行处理
6.返回响应结果
7.通过struts-config.xml查找响应的目的地
8.响应用户(通常是浏览器显示)
当然也可笼统的解释为:
用户提交请求,ActionServlet接受到请求,会把数据封装到一个Formbean对象里面。如果FromBean里面重写了validate方法,那么就会对表单数据进行校验,如果校验成功才会把请求交给对应的Action来进行处理,如果校验失败通过配置文件里面的action 里面的input属性指定错误页面。Action接受请求调用execute方法进行业务处理,然后通过mapping.findForward("转向名字")-转向响应目标


对于struts-config.xml认识(常用的属性)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config SYSTEM "http://struts.apache.org/dtds/struts-config_1_3.dtd" PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN">
-<struts-config>
<!-- ==Form Bean Definitions -->
<form-beans>
<!-- form-bean的配置 第一个是名字自己定义用于action配对,第二个type是该bean的路径 从命包名开始 -->
<!-- 静态form -->
<form-bean type="cn.lovo.LoginForm" name="loginForm"/>
<!-- 动态增加form -->
<form-bean type="org.apache.struts.action.DynaActionForm" name="addStudentForm"> <form-property type="java.lang.String" name="name"/>
<form-property type="java.lang.Integer" name="age"/>
<form-property type="java.lang.Float" name="score"/>
</form-bean>

<form-beans>
<!-- ====Action Mapping Definitions -->
<action-mappings>
<!-- path 给页面请求的路径以及名称 type= 路径 从包名开始 name = 是关联的哪一个formBean attribute=用于在web域取值时用,默认和name的一样 input=进行表单校验才用的,就是表单出错该奔向哪个页面 parameter=是用于继承的action是DispatchAction时用的 scope=表示对应的formbean存在哪一个web域默认是session validate=表单数据是否进行校验 默认是true -->

<action type="com.lovo.LoginAction" name="loginForm" path="/login">
<!-- 转发到某个页面 第一个名字用于action里面调用,path该jsp的路径-->
<forward name="loginSuccess" path="/LoginSuccess.jsp"/>
<forward name="loginFailure" path="/LoginFailure.jsp"/>
</action>
<!-- 测试异常的action -->
<action type="com.lovo.action.exceptionTest.ActionExceptionTest" name="addForm" path="/actionExceptionTest">
<exception type="com.lovo.action.exceptionTest.AddUserException" path="/exception.jsp" key="user"/>
</action>
<!-- 统一配置action用于转发到jsp -->
<action path="/preActionExceptionTest" forward="/WEB-INF/addStudentException.jsp"/>
<!-- DispatchAction配置 加入parameter属性 -->
<action type="com.lovo.dispatchActionTest.StudentDispatchTest"path="/studentDispatchTest" parameter="method">
<forward name="add" path="/add.jsp"/>
<forward name="delete" path="/delete.jsp"/>
<forward name="query" path="/query.jsp"/>
</action>
</action-mappings>
<!-- 配置全局异常处理页面 -->
<global-exceptions></global-exceptions>
<!-- 配置全局Forward -->
<global-forwards></global-forwards>
<!-- 配置资源文件 -->
<message-resources parameter="com.love.action.exceptionTest.resouce"/>
</struts-config>


对Formbean的理解
一个formbean必须继承ActionForm。如果某个Action关联了一个Formbean,那么当浏览器请求这个action的时候,struts的ActionServlet将创建这个Formbean,并将请求参数填充在里面,并按照配置文件里面的scope属性将此存储在对应的web域里面。
一个Formbean除了在ActionServlet中处理请求的过程中会被创建。还可能在jsp页面调用<html:form>标签的时候被创建。也就是说<html:form>标签会生产对应的Formbean对象
Struts1 里面的Formbean里面的属性如果是一个复杂对象的话,那么在书写这个复杂对象的时候必须new一个该对象的实例出来。
对于动态Formbean:可以不用编写Formbean的代码,通过DynaActionFrom实现
示例:

<!-- 动态增加form -->
<form-bean type="org.apache.struts.action.DynaActionForm" name="addStudentForm">

<form-property type="java.lang.String" name="name"/>
<form-property type="java.lang.Integer" name="age"/>
<form-property type="java.lang.Float" name="score"/>
</form-bean>

关于action:
要成为一个action一般情况下是继承Action类。
请求同一个action,它是在第一次请求的时候进行初始化的,不是在读取配置的时候,每一个action只会初始化一次,它是单实例和线程不安全的,所以在action中最好不要有可读写的成员变量
每一个action通过重写父类的execute方法对业务进行操作(DispatchAction不重写)
Execute方法返回一个ActionForward对象,通过该对象找到返回响应的jsp或者action。对应配置文件里面的forwards属性,<forward name="add" path="/add.jsp"/> 默认是用请求转发,如需重定向需要配置属性redirect=true
ActionMapping对象里面封装的是配置文件action里面的值
怎么实现action的安全性编程呢?
注意不要用实例变量或者类变量共享只是针对某个请求的数据
注意资源操作的同步性
对于DispatchAction的使用
比如对于用户的操作一般有crud ,那么我们可以全部在一个action里面进行处理
就样就不用对于一个请求创建一个action了,只需要在一个action里面创建不同的方法进行不同的处理就即可。那么要实现这样的action必须让该类继承DispatchAction
然后在该action的配置文件里面配置一个parameter的属性指定请求参数的名称。
public class DispatchActionDemo extends DispatchAction
该action里面的方法必须和execute方法一模一样(除了名字当然方法里面的内容不需要一样) 例:
/**删除用户信息提交
* */
public ActionForward deleteUser(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
response.getWriter().write("deleteUser");
return null;
}
配置文件:
<action path="/dispatchActionDemo" type="com.lovo.DisPatchActionDemo.action.DispatchActionDemo" parameter="method">
</action>
请求地址:注意参数http://127.0.0.1:8080/DisPatchActionDemo/dispatchActionDemo.do?method=deleteUser


常见问题:如何防止struts配置文件的不断膨胀?
web.xml配置文件里面初始化参数的时候配置文件可以写多个用逗号隔开,(每一个模块单独一个配置文件)
还有就是通过DispatchAction来减少action的数量,这也是一个办法。
常用标签:
<html:rewrite action="">该标签生成请求的action全路径,用于外部访问
例:<form action="<html:rewrite action="/regUser"/>" method="post">
<html:link>生成超链接,对于请求路径直接写action配置里面的path值即可。
例:<html:link action="/regUser">注册(很好)</html:link>
<.html:form>生成表单,此标签会生成formbean对象
例:整个表单内容
<html:form action="/regUser">

用户名:<html:text property="user.name"></html:text>
密码:<html:password property="user.password"></html:text><br/>
年龄:<html:text property="user.age" ></html:text>
爱好:
<logic:iterate id="like" collection="${likes }">
<html:multibox property="user.likes" value="${like.id }" title="${like.name }"></html:multibox>${like.name }
</logic:iterate>
<br/>
favorite:
<html:select property="user.favorite">
<html:optionsCollection name="favorite" value="id" label="title"/>
</html:select>
<html:submit title="注册">注册</html:submit>
</html:form>
标签的property属性用于指定对应的formbean里面的属性,这个属性是必须有的
这些标签在表单校验出错的时候会自动回显数据。
最后附带word文档供下载。