1.Struts框架中控制器组件的类
①ActionServlet类:(接收客户端的请求,将请求转发给RequestProcessor类去做处理)
javax.servlet.http.HttpServlet
↓继承
org.apache.struts.action.ActionServlet
方法:
doGet(HttpServletRequest request,HttpServletResponse response)
{
process(request,response);
}
doPost(HttpServletRequest request,HttpServletResponse response)
{
process(request,response);
}
//★process()
protected void process(HttpServletRequest request,HttpServletResponse response)
{
//在此方法中将调用RequestProcessor类中的process()方法
}
②RequestProcessor类:(接收ActionServlet类发送过来的请求,封装Form表单中的数据到ActionFrom,调用Action类去做处理,并且
接收Action做完处理后的ActionForward返回值,通过ActionForward进行跳转)
RequestProcessor类中会调用一系列的方法:
processLocale() 为请求选择一个语言环境
processContent() 为所有响应设置默认的内容类型(如有必要)
processPopulate() 填充与请求关联的 ActionForm
processInclude() 将调用路径的结果包括在请求中
processActionCreate() 实例化当前 ActionMapping 指定的类的实例
processActionPerform() 将调用 action 的 perform() 或 execute() 方法
processPath() 确定选择将要处理的动作的路径
processMapping() 为请求选择动作映射
processRoles() 检查用户的角色是否允许其访问请求的资源
processActionForm() 新建一个 Form Bean 或从请求会话中检索 Form Bean
processForward() 处理 <action-mapping> 元素的 forward 以匹配当前的请求路径
processValidate() 调用 Form Bean 的 validate() 方法
processPreprocess() 告诉请求处理器调用此方法后是否应继续处理请求(★我们一般可以重写此方法达到
自定义转发请求的目的)
③Action类:(通过ActionForm参数获取表单中的值,调用javaBean做业务处理,返回ActionForward)
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
{
... ...
}
④ActionMapping类:
⑤ActionForward类:
2.对控制器进行扩展有三种方式
①修改ServletAction(这种方式并不推荐所以省略)
②重写RequestProcessor类(配置struts-config.xml文件的<controller>子标签)
③可以采用插件的方式对控制器进行扩展(配置struts-config.xml文件的<plug-in>子标签)
一.重写RequestProcessor类:
说明:
RequestProcessor类是请求处理类,所有的客户端请求都是由此类处理,所以可以自定义类继承自
org.apache.struts.action.RequestProcessor类,并且重写
public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)方法,以此来达到自定义
处理请求的目的。一般像程序的加密解密,对客户端的请求做过滤处理,获取对某些字符串的特殊处理,都可用此方法。
第一步:自定义类,继承至org.apache.struts.action.RequestProcessor。
重写public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)方法
例如:
package action;
import org.apache.struts.action.RequestProcessor;
import javax.servlet.http.*;
public class MyRequestProcessor extends RequestProcessor
{
//重写public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)方法
public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)
{
this.servlet.getServletContext().setAttribute("key", "value");//可以将值存储在全局变量里面(Application)
boolean flag=false;//定义返回值变量
String host=request.getRemoteHost();//通过request对象获取客户端请求的地址
if(!host.startsWith("127."))//判断地址是否不是以127.开头的(一般本机地址的IP是127.0.0.1)
{
flag=true;//★返回值为true,表示将请求向下继续传递,反之为false,则程序停止传递。从而达到自定义控制的作用
}
else
{
try
{
response.sendRedirect("error.jsp");
}
catch(Exception e)
{
e.printStackTrace();
}
}
return flag;
}
}
说明:这里是在判断客户端的请求,是否是自己本机的IP地址,如果是的话这跳转到error.jsp页面,否则则按照原定的跳转路径跳转
这里的返回值起到关键作用,true,表示将请求向下继续传递,为false,则程序停止传递。
第二步:修改配置struts-config.xml文件的<controller>子标签,告诉程序,这里有自定义的控制。
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="action.LoginAction">
<forward name="failure" path="/failure.jsp" />
<forward name="success" path="/success.jsp" />
</action>
</action-mappings>
<controller processorClass="action.MyRequestProcessor"></controller>★★★★
<message-resources />
</struts-config>
说明:
<controller processorClass="action.MyRequestProcessor"></controller>这里就在做配置,告诉程序对程序的请求处理将由
action/MyRequestProcessor.java去执行。
二. 使用插件的方式对控制器进行扩展
插件的原理是在WEB服务启动的时候,(例如:TomCat启动的时候) ,会通过struts-config.xml配置文件加载相应的文件或资源到项目中。
例如,Spring的加载文件等,这有个好处就是,程序会在服务启动时就已经加载完毕,这样不会占用太多的资源,但是他由于只加载一次,
所以,不能动态的修改资源文件,例如对属性文件的修改。
第一步:自定义类实现org.apache.struts.action.PlugIn接口,PlugIn接口中有两个方法:
①public void init(ActionServlet servlet, ModuleConfig conf)throws ServletException;
此方法在服务启动的时候会自动被WEB服务调用。一般做加载资源处理,而且只执行一次。
②public void destroy( );
此方法在服务停止的时候会自动调用,一般做释放资源。
例如:
package action;
import org.apache.struts.action.PlugIn;
import javax.servlet.ServletException;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.action.*;
public class MyPlugIn implements PlugIn//实现PlugIn接口
{
private String customData;
public void setCustomData(String key) {
this.customData = key;
}
//init方法★★★★
public void init(ActionServlet servlet, ModuleConfig conf)throws ServletException {
servlet.getServletContext().setAttribute("hello",customData);//将值存入全局变量中(Application)
}
//destroy方法★★★★
public void destroy( )
{
}
}
说明:
这里的init方法是将customData属性存储到全局变量中(业务逻辑比较简单,只是为了演示),一般的情况下,
这里都是做读取资源文件的操作,例如对外部属性文件的操作,对属性文件的操作是通过ModuleConfig参数执行的。
第二步:配置struts-config.xml文件的<plug-in>子标签,制定资源文件的物理位置
例如:
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="action.LoginAction">
<forward name="failure" path="/failure.jsp" />
<forward name="success" path="/success.jsp" />
</action>
</action-mappings>
<message-resources parameter="ApplicationResources" />
<plug-in className="action.MyPlugIn">★★★
<set-property property="customData" value="Hello from the plugin" />★★★
</plug-in>
</struts-config>
说明:
<plug-in className="action.MyPlugIn">★★★
<set-property property="customData" value="Hello from the plugin" />★★★
</plug-in>
这里就是对资源文件的说明,表示说WEB服务启动的时候会调用action/MyPlugIn.java的init()方法进行资源加载或对资源
文件的一系列的操作,加载的文件内容是Hello from the plugin,文件的映射名称为customData。
注意:这里的文件映射名与action/MyPlugIn.java中的属性名相同,这里是给属性赋值,一般的情况是:
<set-property property="customData" value="WEB-INF/*.properties" />
那样的话,就是将WEB-INF目录下的某个属性文件加载到程序中,而只要通过init()方法中的ModuleConfig参数
对属性文件进行操作就可以了。
****************************************************************************************************************************
附加:
在struts-config.xml配置文件中的配置信息包括一下几个:(他们的顺序不能颠倒)
==============================================================================
①<datasource>:配置数据源,通过此配置可连结到数据库。
<data-sources>
<data-source key="Sql" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="sun.jdbc.odbc.JdbcOdbcDriver" />
<set-property property="url" value="jdbc:odbc:accp" />
<set-property property="username" value="" />
<set-property property="password" value="" />
</data-source>
</data-sources>
注意:这里用的是桥连
//在程序中获取数据库的连接
ServletContext context = servlet.getServletContext();//获取上下文对象
DataSource dataSource =(DataSource) context.getAttribute("Sql");//获取数据源对象
Connection conn = dataSource.getConnection();//获取数据库连接对象
... ... ...
==============================================================================
②<form-bean>:配置ActionForm★(省略)
==============================================================================
③<global-exception>:配置全局性的异常(一般很少配置)
该元素主要配置异常处理,它的exception子元素代表全局的异常配置。struts采取配置的方式来处理异常。
它用来设置java异常和异常处理类org.apache.struts.action.ExceptionHandler之间的映射。它有七个属性,如下所示:
1. className:指定和exception元素对应的配置类,默认为:org.apache.struts.config.ExceptionConfig。可有可无。
2. Handler:指定异常得理类,默认为:org.apache.struts.action.ExceptionHandler。可有可无
3. key:指定在Resource Bundle中描述该异常的消息key
4. path:指定当异常发生时的转发路径。
5. scope:指定ActionMessages实例的存放范围,可选值包括:request和session,默认为request。可有可无。
6. type:指定所需处理异常类的名字,必须。
7. bundle:指定Resource Bundle
如下所示:
<global-exceptions>
<exception
key= "global.error.invalidlogin "
path= "/error.jsp "
scope= "request "
type= "struts.sample.capl.sample3.Exception.InvalidiNameException " />
</global-exceptions>
==============================================================================
④<global-forwards>:配置全局性的跳转(一般很少配置)
该元素主要用来声明全局的转发关系,它具有以下四个属性:
1. className:和forward元素对应的配置类,默认为:org.apache.struts.action.ActionForward。可有可无。
2. contextRelative:此项为true时,表时path属性以"/"开头,相对于当前上下文的URL,默认为false.可有可无。
3. name:转发路径的逻辑名.必填。
4. path:转发或重定向的URL,当contextRelative=false时,URL路径相对于当前应用(application),当为ture时,表示URL路径相对于当前上下文(context)。
5. redirect:当此项为ture时,表示执行重定向操作。当此项为false时表示转向操作。默认为false。
如下所示:
<global-forwards>
<forward name= "forms1 " path= "/a.do "/>
<forward name= "forms2 " path= "/nb.jsp "/>
<global-forwards>
==============================================================================
⑤<action-mapping>:配置Action以及要跳转的页面的映射情况★(省略)
==============================================================================
⑥<controller>:用于配置ActionServlet属性
bufferSize 指定上载文件的输入缓冲的大小。该属性为可选项,默认值为4096.
className 指定和<controller>元素对应的配置类。默认为org.apache.struts.config.ControllerConfig.
contentType 指定响应结果的内容类型和字符编码。该属性为可选项,默认值为text/html。
如果在Action和JSP网页中也设置了内容类型和字符编码,将会覆盖该设置。
locale 指定是否把Locale对象保存到当前用户的Session中。默认值为false.
processorClass 指定负责处理请求的Java类的完整类名。默认值为org.apache.struts.action.RequestProcessor。
如果把此项设置为自定义的类,那么应该保证该类扩展了org.apache.struts.action.RequestProcessor类。
tempDir 指定处理文件上传的临时工作目录。如果此项没有设置,将采用Servlet容器为Web应用分配的临时工作目录。
nochache 如果为true,在响应结果中将加入特定的头参数 :Pragma, Cache-Control和Expires,
防止页面被存储在客户浏览器的缓存中。默认值为false.
如果应用包含多个子应用,可以在每个字应用的Struts配置文件中配置<controller>元素。
这样,尽管这些子应用共享同一个ActionServlet对象,
但是他们可以使用不同的RequestProcessor类。★★★★★
以下是<controller>元素的配置代码示例:
<controller contentType="text/html;charset=UTF-8" locale="true" processorClass="CustomRequestProcessor"/>
==============================================================================
⑦<message-resource>:配置资源信息
主要配置本地化消息文本,它具有以下属性。
1. className:和message-resources元素对应的配置类,默认为org.apache.struts.config.MessageResourcesConfig。
2. factory:指定消息资源的工厂类,默认为:org.apache.struts.util.PropertyMessageResourcesFactory类
3. key:指定Resource Bundle存放的ServletContext对象中时采用的属性Key,
默认由Globals.MESSAGES_KEY定义的字符串常量,只允许一个Resource Bundle采用默认的属性Key。
4. null:指定MessageSources类如何处理未知消息的key,如果为true,则返回空字符串,
如果为false,则返回相关字串,默认为false
5. prameter:指定MessageSources的资源文件名,如果为:a.b.ApplicationResources,
则实际对应的文件路径为:WEB-INF/classes/a/b/ApplicationResources.properties.
如:
<message-resources null= "false " parameter= "defaultResource "/>
<message-resources key= "num1 " null= "false " parameter= "test "/>
访问为:
<bean:message key= "zxj "/>
<bean:message key= "zxj " bundle= "num1 "/>
其中,zxj表法,messagesource资源文件中的一个字符串。
==============================================================================
⑧<plug-in>:配置插件信息
配置Struts的插件,属性如下:
1. className:指定的Struts插件类,必须实现org.apache.struts.action.PlugiIn接口。
如:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>