Struts2.1浅谈

来源:互联网 发布:三维动画软件手机 编辑:程序博客网 时间:2024/05/16 09:35

    Struts2.1是一个极度松藕合的web框架。可以完全将view、model、controller分开。在struts2.1中的controller与2.0一样是一个filter,只是所在位置有所不同。在做Struts2的开发时,我们在页面完全可以只用html控件+action(当然这不代表完全不适用struts的扩展标记,比如<s:fielderror><s:actionerror/>s:actionmessage/>这些我们还是要使用的,我个人一般只是用验证处理和格式的标记),这样美工做出来的页面java程序员就可以不必花掉太多的时间去改静态页了。这边文章我只想简单的阐述struts2.1的一些常用、实用的功能和特点。

    首先要知道做一个struts2.1的case有几个方面。表示层(jsp页面)、action(model),至于控制器上面已经说过了,基本使用不需要java程序员去写代码。表示层不多说了使用html的控件足够了。我们主要说说model。struts2中的model就是action,model对view的封装原则是根据控件的name属性来对应封装的。举个例子:页面中有个控件<input type="text" name="test" />,那么在action中需要声明一个private String test;的属性与页面的控件对应。那么当页面提交到这个action时就会把name为test控件的值装入action的test属性里。struts2还有一个很好的特性不知道大家有没有注意过,就是可以直接将页面中控件的数据封装入对象属性。如果现在我们有一个Student类,我们现在希望在封装时就把test控件的值装入一个Student对象的test属性中,我们就可以将action的代码改成这样:private Student s;并且将页面控件的name改为s.test。

    struts2.1的validation我个人感觉有些多余,使用validate方法就可以了。但是要注意addActionError(),addActionMessage(),addFieldError()的区别。extends ActionSupport后重写validate()方法,对封装的数据进行验证。addActionError()是添加页面中整体的错误,addFieldError()是针对某一个field(即jsp中的控件)添加错误信息,addActionMessage()只是添加消息信息。当然你也可以使用validation。只需要给action配置action-validation.xml文件,在配置文件中添加验证规则即可。例如(字符非空验证):

           <field name="test">
                <field-validator type="requiredstring">
                <param name="trim">true</param> 
                <message>is not null</message>
                </field-validator>
           </field>

如果页面使用的控件是struts2的扩展标记那么会自动输出错误,如果不是在你想输出错误的位置加上<s:fielderror>或其他验证处理的扩展标记,如果你比我更变态的话你可以创建一个FieldError对象添加错信息,然后在页面中从ValueStack中取出来显示。

    如果要说controllor真的不用管的话那要看你看问题的角度了,我认为struts.xml算是暴露给开发人员的最重要部分了。因为核心filter还是要从这个配置文件中去查找映射的。简单说一下配置文件的结构<constant name="" value="">是用来配置struts2框架属性用的,当然这些我们可以分离到struts.properties属性文件中去配置。映射的主要标记有几个:<package>、<action>、<result>、<result-types>、<result-type>、<param>。

    package标记是包,有点类似于java中包的概念,但是又不太一样。extends这个属性体现了不同点。一边来说我们都会继承struts-default这个配置文件。但是如果我们的action用于ajax就会继承json-default。namespace是公共映射路径。name属性只是一个标示随意命名就可以了,不过不要重名就好。

    action是配置映射用的,存在于package内。name是映射url,class是处理的类,method是处理方法。在stuts2中这里可以很多变很灵活。我们可以再name和method两个属性中使用表达式,例如:<action name="actionMapping!*" class="ActionClass" method="*" ></action>,如果你的页面请求的是actionMapping!test的话那么就叫用ActionClass对象的test方法处理。

    result是跳转的配置,在struts2中跳转只需要通过action中方法的返回字符串来决定要跳转到的页面。result有两个属性:name是action返回字符串的值,result标记中的文本是name值对应的跳转页面。type属性是跳转(返回值)方式。

   result-types和result-type是跳转(返回值)类型的设置,格式为:

  <result-types>
   <result-type name="" class=""></result-type>
  </result-types>

   param是参数、在action、result-type 、result内都可以出现。

   浅谈就到这里了。等有时间了,我再写一下struts2.1中框架的属性配置、date封装的处理、拦截器的使用、struts-json等细节方面的文章。最后给个最简单的demo吧。

  index.jsp页面:

<c:form name="form1" action="testAction">
    <c:textfield name="name" label="姓名"></c:textfield>
    <c:submit></c:submit>
   </c:form>

TestAction.java:

public class TestAction extends ActionSupport  {
 private String name;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 @Override
 public void validate() {
   // TODO Auto-generated method stub
  if(getName()==null||getName().equals(""))
   this.addFieldError("name", "error");
  super.validate();
 }
 @Override
 public String execute() throws Exception
 {
  ActionContext.getContext().getValueStack().set("test", "successed!!!!");
  return "success";
 }
}

struts.xml:

<struts>
 <package name="com.struts.action" namespace="/" extends="struts-default">
  <result-types>
   <result-type name="json" class=""></result-type>
  </result-types>
  <action name="testAction" method="execute" class="com.struts.action.TestAction">
   <result name="success">/MyJsp.jsp</result>
   <result name="input">/index.jsp</result>
  </action>
 </package>
</struts> 

成功页面MyJsp.jsp:

<body>

${test}

</body>

 

 

原创粉丝点击