这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤:获取路径、封装表单、获取转向列表、转向逻辑处理、转向,与此对应的是:ActionServlet、ActionForm、ActionMapping、Action、ActionForward。

ActionServlet

这个在上篇博客已经说明,可以访问《 预加载ActionServlet》

ActionForm

ActionForm的主要作用是对表单数据进行封装,这个.NET开发中的实体类有些类似,它的使用有以下限制:ActionForm中的get/set属性名必须和表单字段一致;必须继承自org.apache.struts.action.ActionForm。

ActionForm除了封装数据意外,还可以进行对数据进行校验、组装前初始化属性,当然这分别需要实现validate和reset函数。

ActionForm转换器

它还可以数据自动进行逻辑转换,使用的是bean-utils的转换器,这个在上篇博客中提到了一次,它位于ActionServlet中的initOther()中,如下:

 if (convertNull) {
ConvertUtils.deregister();
ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class);
ConvertUtils.register(new BigIntegerConverter(null), BigInteger.class);
ConvertUtils.register(new BooleanConverter(null), Boolean.class);
ConvertUtils.register(new ByteConverter(null), Byte.class);
ConvertUtils.register(new CharacterConverter(null), Character.class);
ConvertUtils.register(new DoubleConverter(null), Double.class);
ConvertUtils.register(new FloatConverter(null), Float.class);
ConvertUtils.register(new IntegerConverter(null), Integer.class);
ConvertUtils.register(new LongConverter(null), Long.class);
ConvertUtils.register(new ShortConverter(null), Short.class);
}

这个代码段的作用是将转换器初始化到一个map中,它们都实现了Convert接口的方法:

  public Object convert(Class type, Object value);

如boolean类型的转换器,代码如下:

以boolean的转换器为例
public Object convert(Class type, Object value) { if (value == null) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException("No value specified");
}
} if (value instanceof Boolean) {
return (value);
} try {
String stringValue = value.toString();
if (stringValue.equalsIgnoreCase("yes") ||
stringValue.equalsIgnoreCase("y") ||
stringValue.equalsIgnoreCase("true") ||
stringValue.equalsIgnoreCase("on") ||
stringValue.equalsIgnoreCase("1")) {
return (Boolean.TRUE);
} else if (stringValue.equalsIgnoreCase("no") ||
stringValue.equalsIgnoreCase("n") ||
stringValue.equalsIgnoreCase("false") ||
stringValue.equalsIgnoreCase("off") ||
stringValue.equalsIgnoreCase("0")) {
return (Boolean.FALSE);
} else if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException(stringValue);
}
} catch (ClassCastException e) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException(e);
}
} }

可以看到它转换的类型有限,如果我想转换其它的类型怎么办?还好,这里提供了自定义转换器的功能,具体见博客《自定义转换器》

动态ActionForm

它是以配置文件的形式存在的,例如在struts-config中配置:

	<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm" >
<form-property name="username" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer" />
</form-bean>
</form-beans>

需要注意的是动态ActionForm的读取方式稍有不同:

  <body>
用户名:${dynaForm.map.username }; 注意它的获取方式
年 龄:${dynaForm.map.age }
</body>

ActionForward

转向和重定向

struts默认的mapping.findForward是转发,如果需要重定向,则需要添加redirect属性:

<forward name="login" path="/login.jsp" redirect="true"/>

页面保护

一般情况下我们可以通过更改url路径直接访问某一个jsp界面,有时这样是没必要且不安全的,但是如果将其放到web-inf文件夹下,则不可以通过url直接访问,可以做为限制jsp访问的一种方法。

动态修改

struts配置文件启动就加载到内存中,运行期不允许修改,所以不能使用forward.findForward().setRedirect 的值,如果想使用代码实现跳转可以采用以下方式:

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.sendRedirect(request.getContextPath()+"/login.jsp");
return null;
}

	@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
int page=Integer.parseInt(request.getParameter("page").toString());
ActionForward af=null;
af.setPath("/"+page+".jsp");
return af; }

虽然可以使用,但是这会大大降低代码的灵活性和可扩展性,所以不推荐使用。

Action

Action就是核心逻辑控制器,它主要负责获取参数、调用Model、转向三个方面。

ForwardAction

Action的子类,作用与action中的forward标签类似,但是二者在处理的时候还是有区别的,执行RequestProcessor的

     // Process a forward or include specified by this mapping
if (!processForward(request, response, mapping)) {
return;
}

时,如果使用forward属性时,会直接return,而使用ForwardAction时会继续执行。

DispatchAction

详见博客《详解DispatchAction》

ActionMapping

unknown属性

在配置文件中添加unknown属性,即在发生404错误时,自动跳转到unknown的页面,例如:

<action  forward="/unknown.jsp" unknown="true"></action>

input属性

input属性的意思是在struts中配置action时,加入input,这样的作用是省去了一个forward标签,例如

注意使用input属性时,和以前的跳转稍有不同:

总结

文章至此,Struts1的基本组成部分已经讲解完毕,其它诸如国际化、异常处理、标签库等都是实用性的知识,在此不再说明。

更多相关博客,请至《层层递进Struts1(八)之总结》

层层递进Struts1(三)之Struts组成的更多相关文章

  1. 层层递进Struts1(八)之总结

    先来看一下Struts1学习总结的思维导图,画的主要是Struts1中的重点和博客分布,如下所示: 系列博客的侧重点是: Struts1是什么? 为什么要使用它? 如何使用Struts1? Strut ...

  2. 层层递进Struts1(七)详解DispatchAction

    通过前面几篇博客,不知道大家有没有发现这个问题,虽然现在可以灵活控制跳转了,但是Action的数量还是比较多,如何既能保证跳转灵活,还能减少Action的数量?这就是我们这篇博客所说的Dispatch ...

  3. 层层递进Struts1(六)自定义转换器

    Struts提供的类型转换有限,如果我们强行使用没有的类型转换,则会出现错误,以Date类型为例: org.apache.catalina.core.StandardWrapperValve invo ...

  4. 层层递进Struts1(五)之处理流程

    这篇博客我们深入Struts框架执行部分源码,从ActionServlet的process函数开始,看一下其内在的执行过程. 流程图 以下流程图展示的是ActionServlet和RequestPro ...

  5. (三)、Struts第三天

    (三).Struts第三天 Struts核心业务: (Struts提供了哪些功能?) 1.  请求数据自动封装(params拦截器) 2.  struts数据处理方式 * ActionContext ...

  6. Hadoop化繁为简(二)—层层递进轻松入门hdfs

    层层递进-解开hdfs的面纱 1.hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么? 2.hdfs的工作原理是怎样的? 3.每台机器都单独启动有什么弊端?假设有1000台机器需要启动 ...

  7. (三)Struts之Action类基础(一)

    一.Action的类型 A.使用普通的类 必须有public的execute且返回值为String的方法. ActionType.java package com; public class Acti ...

  8. GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台

    注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...

  9. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

随机推荐

  1. MySQL Installation of system tables failed!

    刚开始学习Linux,就遇到了问题. 当在RedHat下安装MySQL时提示如下错误,请高手给点指点,谢谢: rpm -vih  MySQL-server-community-5.0.96-1.rhe ...

  2. mysql 列转行

    第一种方法:使用序列化表的方法实现列转行 第一种方法:使用UNION的方法实现列转行 第二种方法:使用序列化表的方法实现列转行

  3. 根据条件决定My97DatePicker日期控件弹出的日期格式

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  4. chrome 调试跨域iframe

    相关链接:https://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome https://stacko ...

  5. 将2020年交期的PR回写出来了

    OUT_pr表中的交期为2020年和2019年,不应该 回写的PR却回写出来了 优化如下:

  6. Zabbix安装(server和agent)及基本配置

    简介 zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制 ...

  7. java代码分析及分析工具

    一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰.随着时间的推移,业务越来越复杂.代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰. 作为一个互联网电子商务网站的业务支撑系统,业务复 ...

  8. Windows10电脑安装macOS Mojave系统的方法(最新版系统,含超详细步骤截图)

    一.环境及准备工作 1.主机系统:本人系统是Windows10家庭中文版 2.虚拟机软件:VMware Workstation 14 Pro 虚拟机版本号:14.1.1 build-7528167 虚 ...

  9. Java数据结构和算法(一)线性结构

    Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...

  10. Netty 零拷贝(一)Linux 零拷贝

    Netty 零拷贝(一)Linux 零拷贝 本文探讨 Linux 中主要的几种零拷贝技术以及零拷贝技术适用的场景. 一.几个重要的概念 1.1 用户空间与内核空间 操作系统的核心是内核,独立于普通的应 ...