再读Struts1.3.5 User Guide 2 Building View Components

再读Struts-1.3.5 User Guide 2 

第二部分 Building View Components 
1. Struts framework在view方面提供的东西有:MessageResource(for i18n), Formbean用来自动组装form表单和提供validation,taglibs 

2. Internationalized Messages. 国际化,JAVA语言本身在国际化方面提供了如下支持: 

(1) Locale class. 用来给我们定义一个locale 
(2) ResourceBundle. 这其实是一个抽象类,不是一个实现,通过这个接口里面的方法,我们可以把文字信息放到文件中来读取。 
(3) PropertyResourceBundle. 这是最常用的一个ResourceBundle的实现,将文本信息放到properties文件中读取。 
(4) MessageFormat. JAVA的这个类允许我们在文本信息中加入参数信息,比如,在文本信息中加入{0}表示传给这个字符串的第一个参数,{1}是第二个参数,通过这种方式,可以让我们动态生成字符串,而不是字符串都是写死在properties文件中的。 

Struts为我们提供了MessageResources类帮我们实现i18n,这个类的实现就采用了JAVA上述的一些基础类。为了使用这个类,为了在我们的web程序中添加国际化的特性,我们需要在struts-config.xml中加入这样的配置: 

<message-resources parameter="com.mycompany.mypackage.MyApplication"/> 

即定义我们的properties文件的basename,在com.mycompany.mypackage这个目录下,我们可以有这样一些properties文件: 

MyApplication.properties 
MyApplication_xx.properties(这里的xx是两位字符的国家代号,代号列表参考http://java.sun.com/j2se/1.4.2/docs/api/java/util/ResourceBundle.html) 

3. Automatic Form Population. 通过把form和bean联系在一起,可以让我们的form在初始化的时候就从bean获得value,避免了以往的手动编码。以往要这样: 

<input type="text" name="username" 
value="<%= loginBean.getUsername() >"/> 

现在用Struts,只要这样: 

<html:text property="username"/> 

除此以外,Struts还支持文件上传的标签,可以轻松实现上传 

4. Automatic Form Validation. Formbean有一个validate方法可以用来给我们存放输入验证的代码,前面已经提到,formbean是继承自ActionForm的class,在formbean的代码中我们可以override validate这个方法: 

validate(ActionMapping mapping, HttpServletRequest request); 

该方法会在bean的property被设置完成(根据用户输入的form value来set formbean的property)后,在调用Action class的execute方法之前被调用。这个方法可以有这样两种行为: 

(1) 如果验证通过,可以return null或者是一个zero-length的ActionErrors instance. 
(2) 如果验证没有通过,需要return一个ActionErrors的实例,然后request会被forward回input页面,在input页面中通过<html:errors/>来显示这些验证失败的信息。 

默认的formbean(比如使用了DynaFormBean),validate方法都是return null,所以总是直接调用到Action class的execute方法。Struts建议将一些简单的输入错误的验证放到validate中,将business logic的验证放到Action class中。 

5. The Struts Validator. Struts为我们做了一些现成的Validator,要使用这些Validator,需要做这样几个步骤: 

(1) 我们的FormBean要从ValidatorForm继承 
(2) JSP页面中必须要包含<html:javascript>这样的代码 
(3) 必须在validation.xml中定义form的validator,比如: 

CODE: SELECT ALL
<form-validation>
<formset>
<form name="logonForm">
  <field property="username" depends="required">
    <msg name="required" key="error.username"/>
  </field>
</form>
</formset>
</form-validation>


(4) 最后,在struts-config.xml中将Struts Validator这个plugin加载上(Struts Validator是一个extra的组件,不是一个标配的组件):

CODE: SELECT ALL
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,
    /WEB-INF/validation.xml"/>
</plug-in>


上述步骤中,要求我们的formbean要从ValidatorForm继承,这是因为Struts的ValidatorForm做了一些工作,他能从我们所写的validation.xml中读取validate的信息,然后生成相应的javascript代码。 

最后还有非常重要的一点,那就是,如果我们需要使用validator中的判断form中某项是否是int,float等这些基础数据类型的时候(反正就是非String类的东西),要记得设置ActionServlet的convertNull这个init参数为true。如果不这样做的话,那对int,float等的validator都将失效,因为默认这个parameter是0。 

6. Tiles. 可以利用Tiles来定义(在xml中)一个page的layout,然后在xml中定义page中包含那些tile的jsp file。对这个东西没什么兴趣。 

7. Rendering Text. 这一项非常重要! 这一段介绍了如何在Struts的Action中直接返回一些文字,而不是return一个ActionMapping(ActionMapping都是会发生页面跳转的)。这对于我们目前正在做的Ajax是很重要的,因为对Ajax的请求,很多时候是不需要返回一个page的,而且是不允许后台做任何页面跳转的动作的。后台只需要返回Ajax关注的一些文本,然后前台用javascript更新相应的东西就OK了。这里介绍了应该这样做:

response.setContentType("text/plain"); // or text/xml
PrintWriter writer = response.getWriter();
// use writer to render text
return(null);

OK? 其实只要在Action类中return一个null就OK了。不要return一个mapping了。
原文地址:https://www.cnblogs.com/super119/p/1935005.html