一,ActionServlet(中心控制器)
定义:他继承了HttpServlet类,是中心控制器(总控制器),它提供一个中心位置来处理全部的终端请求
作用:接受请求,读取配置文件,派发请求,响应用户
配置:
<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>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
二,Action
|--Action实例化是在接受到ActionServlet的派发请求的时候,而不是在读取配置文件的时候
|-- 每个action只会被实例化一次
(第一种情况:后面的action会覆盖前面的action
第二种情况:内存中也只有一个LoginAction
)
·第一种情况
<action path="/login"type="hwt.action.LoginAction"name="loginForm">
<forwardname="loginSuccess"path="/loginSuccess.jsp"></forward>
<forwardname="loginFailure"path="/loginFailure.jsp"></forward>
</action>
<action path="/login"type="hwt.action.LoginAction"name="loginForm">
<forwardname="loginSuccess"path="/loginSuccess.jsp"></forward>
<forwardname="loginFailure"path="/loginFailure.jsp"></forward>
</action>
·第二种情况
<action path="/login"type="hwt.action.LoginAction"name="loginForm">
<forwardname="loginSuccess"path="/loginSuccess.jsp"></forward>
<forwardname="loginFailure"path="/loginFailure.jsp"></forward>
</action>
<action path="/login1"type="hwt.action.LoginAction"name="loginForm">
<forwardname="loginSuccess"path="/loginSuccess.jsp"></forward>
<forwardname="loginFailure"path="/loginFailure.jsp"></forward>
</action>
|--Struts1中的Action是线程不安全的
·不要使用实例变量和类变量共享只针对某个特定请求的数据
·注意资源共享的同步性
action里面的几个属性:
path:
name:
type:
scope: actionForm的存放范围 默认为session
validate: 默认为true,为验证
input: 这里是确定验证错误的时候的去向页面,一般和validate联合使用
attribute: 存放form的真正关键字,缺省的时候默认为name属性的值
三,ActionMapping
在配置文件中的每一个<action></action>都与一个ActionMapping实例对应
mapping.getPath(); 得到action的path属性的值
mapping.getType(); 得到action的type
mapping.getName(); 得到action的name;
mapping.findForwards(); 得到action中的Forward的一个数组
mapping.findForward(String name); 返回一个ActionForward
四,ActionForward(导航器)
· contextRelative- Should the pathvalue be interpreted as context-relative (instead of module-relative, if itstarts with a '/' character? [false]
· name- Logical name bywhich this instance may be looked up in relationship to a particularActionMapping.
· path- Module-relativeor context-relative URI to which control should be forwarded, or an absolute orrelative URI to which control should be redirected.
· redirect- Set to true ifthe controller servlet should call HttpServletResponse.sendRedirect() on theassociated path; otherwise false. [false]
|
重定向:
<forwardname="loginFailure"path="http://www.baidu.com"redirect="true"></forward>
redirect == false --> 内部调用的是RequestDispatcher.forward
redirect == true --> 内部调用的是HttpServletResponse.sendRedirect();
五,actionForm
actionForm的填充是有ActionServlet填充的,工作原理:
1,ActionServlet读取配置文件
2,actionServlet接受请求的时候,通过配置文件判断该请求需不需要form
3,如果需要,就根据<action ....name="" scop="">name里面的参数和scope里面的参数来找Form,scope里面的参数缺省值为session,scope.getParameter("name"); 如果scope里面没有form这个实例,那么实例化这个对象
4,通过实例化的对象带入到action中
实例化ActionForm时候内部方法顺序:
构造函数
|
reset()方法
|
setter()方法 --》 页面的填充是根据setter方法中的名字,而不是字段名字
|
validate()方法来验证
========== 动态form-bean---------DynaActionForm
动态formbean就是不要写form-bean的java实现类,只需要在配置中配置一下,在配置文件中这样写
<form-beans>
<form-beanname="loginForm"type="org.apache.struts.action.DynaActionForm">
<form-propertyname="username"type="java.lang.String"/>
<form-propertyname="password"type="java.lang.String"/>
</form-bean>
</form-beans>
在实现类中要用这里的面的属性的话:
public ActionForward loginMethod(ActionMapping mapping, ActionForm form,
HttpServletRequestrequest, HttpServletResponse response) throws Exception {
DynaActionForm dynaActionForm = (DynaActionForm)form;
String username = dynaActionForm.get("username").toString();
String password = dynaActionForm.get("password").toString();
response.getWriter().print(username+"--"+password);
return null;
}
=======对于validate验证方法通过不了的,要在页面显示错误信息的:
1,要想做国际化一样,首先要建立资源文件ApplicationResources.properties,在这里面写错误信息
2,对于资源文件,要在struts-config.xml里面注册
<message-resourcesparameter=" " />
而要注意的是在<action .... validate="true" input=""/>
3,对于form 里面的validate方法
public ActionErrors validate(ActionMapping mapping,
HttpServletRequestrequest) {
ActionErrors errors = newActionErrors();
ActionMessage message = new ActionMessage("这是写资源文件中的键",true);
errors.add("这里是写页面的property内容", message);
System.out.println(errors);
return errors;
}
4,在页面<html:errors property=""/>----记得要导入想要的tld文件
==========
Session和request中的属性的监听器的实现:
1,在web.xml中配置
<listener>
<listener-class></listener-class>
</listener>
2,实现类
实现两个接口:HttpSessionAttributeListener,ServletRequestAttributeListener
然后重写里面的方法