Struts

Struts
学习Struts前先简单了解一下什么叫MVC三层架构:
MVC是一种设计模式,它强制性地把应用程序的输入,处理和输出分开.MVC将应用程序分为三部分:
1,模型:负责业务逻辑
2,视图:负责表示业务数据的视图
3,控制:负责控制用户输入的流和状态

MVC的优缺点
优点:将显示,逻辑,和数据分开.提高了模型的可移植性.
缺点:增加了系统结构和实现的复杂性,在提高大项目开发效率的同时降低了小项目的开发效率.

Struts

Struts实际上是在JSP Model2的基础上实现的一个MVC框架。Struts框架实现的只是MVC的视图和控制器组件,视图由一组JSP文件组成,控制器由ActionServlet和Action来实现。

1. Struts视图
Struts框架中的视图由一组JSP页面构建的。在这些JSP页面不应出现业务逻辑。只有标签,这些标签可以是标准的JSP标签,也可以是自定义标签。除此之外,通常也反ActionForm Bean也划分到视图层中,ActionForm Bean是一种JavaBean。是Struts框架用来进行视图和控制器之间表单数据的传换的。

2. Struts控制器
控制器是Struts的重要组成部份。由ActionServlet类和Action类来实现。ActionServlet继承了javax.servlet.http.HttpServlet类。它在MVC模型中扮演着中央控制器的角色。ActionServlet主要负责接受HTTP的请求信息,并根据配置文件struts-config.xml的配置信息,把请求转发至适合的Action对象,如果Action对象不存在。ActionServlet会先创建这个对象。

3 Struts-config.xml配置文件
这配置文件的信息在系统启动的时候就读入到内存,并供Struts在运行期间使用。在用户发送请求到ActionServlet时,ActionServlet会访问Strutst-config.xml配置文件,并根据配置文件中的Action信息把请求转发至Action对象。在Struts-config.xml中,每一个Action的信息都通过一个Action元素来配置。

4 Struts的基本交互步骤
在WEB应用启动时就会先加载并初始化ActionServlet,而ActionServlet从Struts-confit.xml文件中读取配置信息:
(1)用户发送的所有请求都提交到ActionServlet处理。
(2)ActionServlet根据struts-config.xml配置文件中的配置信息,将请求转发至对应的Action对象。
(3)在用户提交表单时,一个配置好的ActionForm对象将被创建,并被填入表单的相应数据。
(4)Action对象从ActionForm对象中取得数据。
(5)Action对象调用业务逻辑组件,完成业务功能。
(6)再根据struts-config.xml配置文件中的配置信息返回到JSP页面中。

Struts的优缺点:
优点:
使用标准的HTTP请求-响应设计来定义
使用容器的默认日志记录系统,不需要单独的包进行配置
在处理过程中可以记录状态消息,这有助于调试。
支待本地化
提供标签扩展
提供详细的JAVA文档和用户指南
缺点:
没有事件模型
无法自动调试,要手动设置代码断点调试
没有默认数据或具体建议
标签扩展要求提供多个属性,因此难以进行详细的编程

Strurst控制器

Strurst控制器(ActionServler):

Struts的控制器主要执行以下任务:
1、接受用户的请求
2、根据不同的请求去调用对应的模型组件(Action)来执行相应的业务逻辑。
3、获取业务逻辑的执行结果。
4、根据当前的状态数据及业务逻辑的处理结果,选择适合的视图组件(JSP)返回给客户。

Struts框架中控制器组件的类主要如下

ActionServlet
RequestProcessor
Action
ActionMapping
ActionForward

ActionServlet
是一个Servlet类,扩展了javax.servlet.http.HttpServlet,实现了servlet的生命周期的方法(init(),doGet(),doPost(),destroy())之处,还添加了一个真正处理请求的方法process.,实际上控制器所执行的控制逻辑包含在RequestProcessor类中,而不是ActionServlet类中。RequestProcessor类的process()方法从struts-config.xml文件中根据请求的URI查找匹配的<action>子元素,并根据<action>子元素的"name"属性在该配置文件中查找匹配的<form-bean>子元素。确定下一步要用到的ActionForm Bean.,取得FormBean的名称后,process()方法将创建或检索由<form-bean>元素的type属性命名的ActionForm的一个实例。然后用再请求提交的值来填充数据。并调用ActionForm的validate()方法验证提交的值。最后process()方法才真正开始处理请求。它首先从<action>元素的type属性获得action类的名称,然后调用Action类里的execute()方法。由execute()方法返回一个ActionForward对象,确定应用程序的下一个视图。

页面请求代码(login.jsp) 复制内容到剪贴板
代码:
<form action="/login" method="post">
..........
</form>根据请求action,访问配置文件里的<action>子元素,提交表彰访问的action值与action里的path值必须要一致,因为是根据这个来查找对应的action, 复制内容到剪贴板
代码:
<action name="loginForm" path="/login" scope="request" type="com.test.loginAction">
<forward name="success" path="/index.jsp" />
</action>然后再根据name属性指定的名称检索对应的FromBean,要自动填充FormBean,表单提交的name与FormBean中的属性名字要一致。 复制内容到剪贴板
代码:
<form-bean name="loginForm" type="com.zhuoming.login.LoginForm" />取得数据后,再根据<action>里的type属性里指定的内容去调用对应的Action 复制内容到剪贴板
代码:
<action name="loginForm" path="/login" scope="request" type="com.test.loginAction">
<forward name="success" path="/index.jsp" />
</action>然后调用Action类里的execute()方法。由execute()方法返回一个ActionForward对象,ActionForward对象根据<forward>子元素里的name与path返回到到指定的页面 复制内容到剪贴板
代码:
<action name="loginForm" path="/login" scope="request" type="com.test.loginAction">
<forward name="success" path="/index.jsp" />
</action>RequestProcessor
RequestProcessor类的部分方法及说明


方法
说明

processPath() 获取客户端请求的URI
processMapping() 根据请求URI获取所需的映射信息
processRoles() 检查用户的角色是否允许他访问请求的资源
processActionForm() 新建一个FormBean或从会话中检索一个Form Bean
processForward() 处理<action-mapping>元素的forward以匹配当前的请求路径
processValidate() 调用Form Bean的validate()方法验证数据
processPerprocess() 告诉请求处理器调用此方法后,是否应继续处理请求
processLocale() 为请求选择一个语言环境
processActionCreate() 实例化当前ActionMapping指定类的实例
processActionPerform() 将调用action的perform()或execute()方法
从Struts1.1版本后,要实现ActionServlet类的扩展,一般都是扩展RequestProcessor类。要开发自已的RequestProcessor类应遵循以下的步骤:
(1)创建一个继承org.apache.struts.action.RequestProcessor的类。并要有一个无参的空构造函数。
(2)重写所需要的方法,加入定制功能
(3)修改配置文件struts-config.xml,在其中加入一个名为<controller>的元素,用以指定自创建的RequestProcessor类

其中controller元素的属性
属性 说明
processorClass 指定负责处理请求的java类的完整类名,默认值为org.apache.struts.action.RequestProcessor。此项可以设置为一个已继承默认类的自定义类,以保证该类扩展了RequestProcessor类
contentType 指定响应结果的内容类型和字符编码
local 指定是否把Local对象保存到当前的用户的Session中

在Struts中解决乱码的方法之一是扩展RequestProcessor类,在其的processPreprocess()中将request,response的字符编程设置为你的要字符编码,代码如下: 复制内容到剪贴板
代码:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.config.ForwardConfig;
import org.apache.commons.logging.Log;
public class MyRequestProcessor extends RequestProcessor {
public MyRequestProcessor(){};
public boolean processPreprocess(HttpServletRequest request, HttpServletResponse response)
{
try {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
} catch (Exception e) {
System.out.println("字符集设置失败!");
e.printStackTrace();
}
return true;//不论成功与否,都要继续往下执行
}
}在Struts-config.xml中加入
<controller processorClass="你自定义的RequestProcessor类完整类名" ></controller>

Action

Action类是用户请求与业务逻辑之间的桥梁。每一个Action都充当客户的一项业务代理。Actin类包含有一个execute()方法,当调用一个动作来处理请求时,会调用此方法。它返回一个ActionForward类的对象。由ActionForward类告知Struts控制器ActionServlet类有知一系列动作中的下一个动作。
execute()方法包括有以下几种参数含义:

参数
说明

ActionMapping 是对文件struts-conig.xml中配置信息的映射
ActionForm 与当前请求表单信息对应的ActionFORM Bean
HttpServletRequest 指HTTP请求对象
HttpServletResponse 指HTTP响应对象

ActionForWard类
Action对象返回一个ActionForward类的对象,ActionForward类则可提供有关下一视图的信息。ActionForward对象映射的是配置文件struts-config.xml中的<forward>元素,封装了目标响应页面的URI。 复制内容到剪贴板
代码:
<action-mapping>
.....
<forward name="逻辑名" path="目标页面URI" />
.....
</action-mapping>ActionForward类的主要属性如下:

参数
说明

name 指定ActionForward的逻辑名,ActionForward类的findForward()方法根据些标示来查找相应的ActionFroward对象。
path 指定目标页面
redirect 标明页面的转向方式。默认为false,如果是值为true,则重定向控制权

Struts插件
在Struts中,在配置文件中使用<plug-in>元素用于配置Struts插件。插件是一个JAVA类,它在应用程序启动时就被初始化,而在应用程序关闭时就销毁。 复制内容到剪贴板
代码:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="validatorConfigLocation" value="/WEB-INF/validator-rules.xml"/>
</plug-in> 以上代码中,第一个<plug-in>配置了Spring的配置文件,第二个<plug-in>则配置了Validator验证框架。以上两个插件的使用方法请参阅其他资料。

Struts国际化
国际化,简称I18N,全称是Internationalization,取第一个字母种最后一个字母,而此单词一共有18个字母,所以就简称为I18N了。国际化的好处是,当程序需要添加一种新的语言时,不需要对已有的软件返工,无需要修改代码。
在Struts框架中进行应用程序国际化,支持的重点在于应用程序的文本和图像表示。最重要的工作是准备Resource Bundle资源包。事实上,在准备资源包的过程,就是把对应不同语言的用户所涉及的的文本和图片保存在多个文本文件中,根据客户端不同的环境需要进行更换。这些文本文件被称为“属性文件”。所有属性文件全在一起就被称为资源包了。

下面以Eclipse为例,在struts中创建一个国际化的应用程序:

(1)首先打开Eclipse,新建一个Web程序。然后添加Struts。

(2)找到程序自生成的ApplicationResources.properties文件在文件里输入 复制内容到剪贴板
代码:
label.loginName=UserName;
label.loginPwd =PassWord;
button.sure =sure;
button.cencal =cencal;(3)复制此文件,并在同一目录下创建一个英文资源文件ApplicationResources_en.properties。内容不变。

(4)复制此文件,并在同一目录下创建一个临时资源文件ApplicationResources_temp.properties。并将内容改为 复制内容到剪贴板
代码:

label.loginName=用户名;
label.loginPwd =密码;
button.sure =确定;
button.cencal =取消;(5)对临时资源文件进行编码转换,在DOS下执行以下命令(先进入到资源文件的目录(TOMCAT上的)) 复制内容到剪贴板
代码:
native2ascii -encoding gb2312 ApplicationResources_temp.properties ApplicationResources_zh_CN.properties(6)编写页面(index.jsp,由于要使用到Struts-bean标签,所以要引用struts-bean.tld文件) 复制内容到剪贴板
代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<head>
</head>
<body>
<p><bean:message key="label.loginName"/><input type="text" name="loginName"></p>
<p><bean:message key="label.loginPwd"/><input type="text" name="loginName"></p>
<p>
<button><bean:message key="button.sure"/></button>
<button><bean:message key="button.cencal"/></button>
</p>
</body>
</html>(7)在Struts-config.xml文件添加(一般已经自动生成的了) 复制内容到剪贴板
代码:
<message-resources parameter="com.i18n.struts.ApplicationResources" />(8)启动TOMCAT服务器后,打开页面,在IE中依次选择“工具”->“常规”->“语言”,在弹出的窗口里点添加,将英语的加入。依次测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值