zoukankan      html  css  js  c++  java
  • 层层递进Struts1(三)之Struts组成

        这篇博客我们来说一下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(八)之总结》


  • 相关阅读:
    流畅的python,Fluent Python 第四章笔记
    Python中的eval()、exec()及其相关函数(转)
    给自己与初学者关于decode,encode的建议(啥utf-8,GBK)。
    流畅的python,Fluent Python 第三章笔记
    流畅的python,Fluent Python 第二章笔记
    python数组array.array(转帖)
    流畅的python,Fluent Python 第一章笔记
    流畅的Python第五章,一等函数笔记
    python中的__slots__使用极其定义(转)
    load
  • 原文地址:https://www.cnblogs.com/riskyer/p/3220154.html
Copyright © 2011-2022 走看看