176142998

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

#

插件提供了一种名为json的ResultType,一旦为某个Action指定了一个类型为json的Result,则该Result无需映射到任何视图资源。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的数据,并将该数据返回给客户端页面的JavaScript。

  简单地说,JSON插件允许我们在JavaScript中异步调用Action,而且Action不再需要使用视图资源来显示该Action里的状态信息,而是由JSON插件负责将Action里的状态信息返回给调用页面——通过这种方式,就可以完成Ajax交互。

  Struts2提供了一种可插拔方式来管理插件,安装Struts2的JSON插件与安装普通插件并没有太大的区别,一样只需要将Struts2插件的JAR文件复制到Web应用的WEB-INF/lib路径下即可。

  安装JSON插件按如下步骤进行:

  (1)登陆http://code.google.com/p/jsonplugin/downloads/list站点,下载Struts2的JSON插件的最新版本,当前最新版本是0.7,我们可以下载该版本的JSON插件。

  (2)将下载到的jsonplugin-0.7.jar文件复制到Web应用的WEB-INF路径下,即可完成JSON插件的安装。

  实现Actio逻辑

  假设wo,en输入页面中包含了三个表单域,这三个表单域对于三个请求参数,因此应该使用Action来封装这三个请求参数。三个表单域的name分别为field1、field2和field3。

  处理该请求的Action类代码如下:   public class JSONExample
  {
  //封装请求参数的三个属性
  private String field1;
  private transient String field2;
  private String field3;
  //封装处理结果的属性
  private int[] ints = {10, 20};
  private Map map = new HashMap();
  private String customName = "custom";
  //三个请求参数对应的setter和getter方法
  public String getField1()
  {
  return field1;
  }
  public void setField1(String field1)
  {
  this.field1 = field1;
  }
  //此处省略了field1和field2两个字段的setter和getter方法
  ...
  //封装处理结果的属性的setter和getter方法
  public int[] getInts()
  {
  return ints;
  }
  public void setInts(int[] ints)
  {
  this.ints = ints;
  }
  public Map getMap()
  {
  return map;
  }
  public void setMap(Map map)
  {
  this.map = map;
  }
  //使用注释语法来改变该属性序列化后的属性名
  @JSON(name="newName")
  public String getCustomName()
  {
  return this.customName;
  }
  public String execute()
  {
  map.put("name", "yeeku");
  return Action.SUCCESS;
  }
  }
  在上面代码中,使用了JSON注释,注释时指定了name域,name域指定Action属性被序列化成JSON对象的属性名。除此之外,JSON注释还支持如下几个域:


  

serialize:设置是否序列化该属性

  deserialize:设置是否反序列化该属性。

  format:设置用于格式化输出、解析日期表单域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。

  配置该Action与配置普通Action存在小小的区别,应该为该Action配置类型为json的Result。而这个Result无需配置任何视图资源。

  配置该Action的struts.xml文件代码如下:  <?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="example" extends="json-default">
<action name="JSONExample" class="lee.JSONExample">
<result type="json"/>
</action>
</package>
</struts>  
  在上面配置文件中有两个值得注意的地方:

  第一个地方是配置struts.i18n.encoding常量时,不再是使用GBK编码,而是UTF-8编码,这是因为Ajax的POST请求都是以UTF-8的方式进行编码的。

  第二个地方是配置包时,自己的包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
posted @ 2008-08-04 09:33 飞飞 阅读(196) | 评论 (0)编辑 收藏

     摘要: div标签用于在页面上生成一个div元素,但这个div元素内容不是静态内容,而是从服务器上获取数据,为了让该div能够取得服务器上的数据,必须为div标签指定一个href属性,这个href属性必须是一个action,该action负责生成该div的内容 因为div是一个ajax标签,因此要为这个标签增加theme="ajax"属性 web.xml   <?xml&nbs...  阅读全文
posted @ 2008-08-04 09:29 飞飞 阅读(2083) | 评论 (0)编辑 收藏

一、iterator.

这个标签主要的的作用就是跌代出集合。。

value属性表示需要跌代显示出来的值。

status属性,又来保存跌代时的一些状态值。

注:1.如果需要引用valueStack中的值,需要使用这样的形式。

<s:iterator value="#userList" />  //userList在action部分被保存在Request中,所以使用#加属性名来引用值。

2.如果集合的值是通过action的方法,假设我们的action中有一个getListMenu方法,返回一个List集合。

我们可以使用如下的形式来引用这个集合,并用s:iterator来输出。

<s:iterator value="listMenu" />

3.iterator的value使用定义好的方式,如:

<s:iterator value="{1,2,3,4}" />         //这样跌代输出的值就是1.2.3.4这四个值。

二、iterator中输出具体值,如果,在上面我们的list中的对象,有两个属性,都是String类型,一个是name,一个是url。

我们可以这样来引用。

1.      <s:property value="name" />       //这样我们将可以输出跌代对象的name属性值。

2.     如果我们希望使用<s:url />来将跳转过后的url进行处理,该如何来做?

         <s:url value="%{url}"/>            //%{}ognl的表达式,这样的值能够将url的值进行<s:url/>的处理

         实际上就是转为绝对路径。这样,我们就可以对付一些因跳转换产生的路径问题。

    原因:因为<s:iteratotr />以后,当前的对象应该就在ValueStack顶部了,这样当然的url实际上就是对象的url          属性了

三、使用ognl输出对应的值。

<s:textfield name="loginName" value="%{#request.loginNames}"/>

 

使用此表达式,会生成一个文本框,并且,如果request.attribute中有loginNames属性,将会做为些文本框的默认值。

如果只使用#request.loginNames在struts2的标签内部,是不会显示任何值的,注意外面加上的%{}附号,才会被正常的使用。

如果希望如EL语言一样直接输出文件,如在一个<a></a>之间的innerHTML文本为#request.loginNames的值,我们只要使用:<s:property value="#request.loginNames" />使可以正常使用!

 

注:

1.${}是EL语言的 %{}这样的形式是ognl表过式语言的,在struts2的标签内部,使用%{}这样的形式,在标签外部可以使用${}EL语言的方式。如果在struts2的标签内部使用${}这样的方式,会出现以下的错误提示:

According to TLD or attribute directive in tag file, attribute value does not accept any expressions

2.很多时候,我们使用struts2的一些标签,属性是需要接受集合的,如果集合是保存在request,session,或者是值栈(非根对象的栈顶),可以使用#变量名的方式,如果获取的值是在Action中通过特定的方法来获取,就需要使用如 value="userList"这样的方式,只是去掉了前面的#。

 

3.可能我对一些值栈,根对象,栈顶的一些ognl知识有些不错误,如果发现了问题,请帮助指出,谢谢。

posted @ 2008-08-04 09:25 飞飞 阅读(221) | 评论 (0)编辑 收藏

     摘要: Struts.xml 文件 Java代码 <?xml version="1.0" encoding="UTF-8" ?>    <!DOCTYPE struts PUBLIC        "-/...  阅读全文
posted @ 2008-08-04 00:26 飞飞 阅读(325) | 评论 (0)编辑 收藏

   1. <%@ page contentType="text/html; charset=GBK" language="java"%> 
   2.
<%@taglib prefix="s" uri="/struts-tags"%> 
   3.
<html> 
   4.
<head> 
   5.
<title>s:if标签测试</title> 
   6.
</head> 
   7.
<body> 
   8.
<s:set name="age" value="29"/> 
   9.
<s:if test="${age > 60}"> 
  10.     老年人 
  11.
</s:if> 
  12.
<s:elseif test="${age > 35}"> 
  13.     中年人 
  14.
</s:elseif> 
  15.
<s:elseif test="${age > 15}" id="wawa"> 
  16.     青年人 
  17.
</s:elseif> 
  18.
<s:else> 
  19.     少年 
  20.
</s:else> 
  21.
</body> 
  22.
</html> 


比如登陆模块
<s:textfield label="用户名" name="user.username"/>
<s:password label="密码" name="user.password"/>
这样写的话,他会默认换行,可以不换行吗?

只要你将它的这个theme属性设成simple那么它就不会用Struts2的格式了,每个STRUTS1的标签都有这样的一个性!!!!



问题:No result defined for action cn.bbs.nhpop.web.action.ReplyTopic Action and result input 错误

意思是说没定义input的跳转结果.

    @Override
    
public String execute() throws Exception {
        topic 
= topicService.getTopic(topicId);
        reply.setTopic(topic);
        replyService.replyTopic(reply);
        
return this.SUCCESS;
    }

原因:我的cn.bbs.nhpop.web.action.ReplyTopic Action execute方法返回SUCCESS,但是实际运行中出现了错误(抛了异常),Action并没有返回SUCCESS而是返回INPUT(Action出现错误时默认的返回值),而我的struts.xml配置文件中并没有定义与INPUT对应的Result

        <action name="replyTopic"
            class
="cn.bbs.nhpop.web.action.ReplyTopic">
            
<result name="success" type="chain">
                
<param name="actionName">listTopicsDetails</param>
            
</result>
        
</action>

 

解决方法:你可以添加一个与INPUT对应的Result或者解决Action方法实际运行中的异常。

我的Action到底抛了个什么异常呢?

        <s:form action="replyTopic">
            
<s:hidden name="topicId" value="%{topicId}"></s:hidden>
<%--            <s:param name="topicId" value="%{topicId}"></s:param>--%>

</s:form>
这是我的reply.jsp,开始我使用<s:param></s:param>传topicId,想当然的认为可以与<s:form></s:form>合用传参,导致replyTopic Action无法获取到topicId的值
    @Override
    
public String execute() throws Exception {
        topic 
= topicService.getTopic(topicId);
        reply.setTopic(topic);
        replyService.replyTopic(reply);
        
return this.SUCCESS;
    }
topic为null抛异常。(<s:url action=""><s:param></s:param></s:url>是可以这样传参的,但与<s:form></s:form>不行)
后来用<s:hidden></s:hidden>代替解决。另外
<s:hidden name="topicId" value="topicId"></s:hidden>
value="%{topicId}"切不可省去%{}否则Action中的topicId的值为字符串为"topicId"而不是我希望的int值1,%{topicId}相当于
<s:property value="topicId"/>
你可以使用%{}或嵌套<s:property>标签。struts2标签的属性可以接受一个字符串的值的时候请大家尤其注意,必须使用%{} 或<s:property>才会是你想要的值。比如:
<s:hidden name="topicId" value="%{topicId}"></s:hidden>


            
<s:url id="toReply" action="toReply">
                
<s:param name="topicId" value="topicId"></s:param>
            
</s:url>

            
<tr>
                
<td height="18" colspan="2">
                    
&nbsp;
                    
<s:a href="%{toReply}">回复 </s:a> &nbsp;
                
</td>
            
</tr>


<s:select name="page" list="page" listKey="key" listValue="value" value="page"></s:select>

@SuppressWarnings("unchecked")
 public List<HashMap> getPage(){
  List<HashMap> numPage = new ArrayList<HashMap>();   
  
  for(int i=0;i<10;i++){
   HashMap m=new HashMap();
   m.put("key", i);
   m.put("value", i+1);
   numPage.add(m);
  } 
  return numPage;
  
 }
posted @ 2008-08-01 14:23 飞飞 阅读(2785) | 评论 (2)编辑 收藏

在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到
1.通过ActionContext class中的方法getSession得到
2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作
 
下面先看一个采用第一种方式,在action中得到session的例子

package s2.ex.action;

 

import java.util.Map;

 

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

 

public class SessionTestAction extends ActionSupport {

 

    public String execute() {

       ActionContext actionContext = ActionContext.getContext();

       Map session = actionContext.getSession();

       session.put("USER_NAME", "Test User");

       return SUCCESS;

    }

}
在这个例子中,通过ActionContext得到session,并往session里放置一个key为USER_NAME,值为Test User的内容。
 
下面是一个实现org.apache.struts2.interceptor.SessionAware接口来对session操作的例子

package s2.ex.action;

 

import java.util.Map;

 

import org.apache.struts2.interceptor.SessionAware;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class SessionTest1Action extends ActionSupport implements SessionAware {

    private Map session;

    public void setSession(Map session) {

       this.session = session;

 

    }

    public String execute() {

       this.session.put("USER_NAME", "Test User 1");

       return SUCCESS;

    }

 

}
在这个例子中实现了接口SessionAware中的setSession方法。
 
上面两种方式都可以得到session,能实现的功能都是一样的。
这里推荐通过第二种方式来使用session,原因是便于做单体测试,用第二种方式,只需要构造一个Map就可以对action class进行单体测试了。
在一个项目中可能会有很多action都需要用到session,如果每个action都来实现org.apache.struts2.interceptor.SessionAware这个接口,可能会显得比较麻烦,所以建议作一个抽象的BaseAction类来实现org.apache.struts2.interceptor.SessionAware接口,以后所有的action只要继承这个BaseAction就可以了。
 
下面是一个如何在JSP中使用session的例子。

<%@ page contentType="text/html; charset=UTF-8" %>

<%@page pageEncoding="utf-8" %>

<%@taglib prefix="s" uri="/struts-tags" %>

<html>

<head>

    <title>Session Test</title>

</head>

 

<body>

<h1><s:property value="#session.USER_NAME"/></h1>

<h1>${session.USER_NAME}</h1>

</body>

</html>
一般在项目中往往会往session里放置一个Object,必如说user,user里有个boolean admin和String userName,如果user里存在isAdmin的方法,在jsp中可以通过<s:if test="#session.user.admin">来判断用户有没有管理权限,通过<s:property value="#session.user.userName">或者${session.user.userName}来取得用户名。
posted @ 2008-08-01 14:13 飞飞 阅读(224) | 评论 (0)编辑 收藏

Struts2中最简单的验证数据的方法是使用validate。我们从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldErroraddActionError加入相应的错误信息,如果存在ActionField错误,Struts2会返回“input”(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。

这两个add方法和ActionErrors类中的add方法类似,只是add方法的错误信息需要一个ActionMessage对象,比较麻烦。除了加入错误信息外,还可以使用addActionMessage方法加入成功提交后的信息。当提交成功后,可以显示这些信息。

以上三个add方法都在ValidationAware接口中定义,并且在ActionSupport类中有一个默认的实现。其实,在ActionSupport类中的实现实际上是调用了ValidationAwareSupport中的相应的方法,也就是这三个add方法是在ValidationAwareSupport类中实现的,代码如下:
private final ValidationAwareSupport validationAware = new ValidationAwareSupport();

public void addActionError(String anErrorMessage) 
{      validationAware.addActionError(anErrorMessage);
}
public void addActionMessage(String aMessage) 
{
    validationAware.addActionMessage(aMessage);
}
public void addFieldError(String fieldName, String errorMessage) 
{
    validationAware.addFieldError(fieldName, errorMessage);
}

下面我们来实现一个简单的验证程序,来体验一个validate方法的使用。

先来在Web根目录建立一个主页面(validate.jsp),代码如下:


<%@ page language="java"  pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
 <head>
  <title>输入操作数</title>

  <style type="text/css">
.label {
 font-style: italic;
}

.errorLabel {
 font-style: italic;
 color: red;
}

.errorMessage {
 font-weight: bold;
 color: red;
}
</style>

 
</head>

 <body>
  求代数和
  <br />
  <s:form action="First">
   <s:textfield name="operand1" label=" 操作数1" />
   <s:textfield name="operand2" label=" 操作数2" />
   <s:submit value="代数和" />
  </s:form>
 </body>
</html>

在上面的代码中,使用了Struts2tag<s:actionerror><s:fielderror><s:actionmessage>,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息为空,则不显示。

现在我们来实现一个动作类,代码如下:


package action;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class FirstAction extends ActionSupport {
 private int operand1;
 private int operand2;

 public String execute() throws Exception {
  System.out.println(getFirst() + "//////////");
  if (getFirst() <= 0) // 如果代码数和是非负整数,跳到positive.jsp页面
  {
   return INPUT;
  }
  return SUCCESS;
 }

 public int getOperand1() {
  return operand1;
 }

 public void setOperand1(int operand1) {
  System.out.println("operand1:" + operand1);
  this.operand1 = operand1;
 }

 public int getOperand2() {
  return operand2;
 }

 public void setOperand2(int operand2) {
  System.out.println("operand2:" + operand2);
  this.operand2 = operand2;
 }

 public int getFirst() {
  return operand1 + operand2; // 计算两个整数的代码数和
 }

}


大家从上面的代码可以看出,Field错误需要一个key(一般用来表示是哪一个属性出的错误),而Action错误和Action消息只要提供一个信息字符串就可以了。

最后来配置一下这个Action,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

 <package name="struts2" extends="struts-default">
  <action name="First" class="First">
   <result name="input">/index.jsp</result>
   <result name="success">/positive.jsp</result>
 </action>
 </package>
</struts>


 

我们还可以使用ValidationAware接口的其他方法(由ValidationAwareSupport类实现)获得或设置字段错误信息、动作错误信息以及动作消息。如hasActionErrors方法判断是否存在动作层的错误,getFieldErrors获得字段错误信息(一个Map对象)。下面是ValidationAware接口提供的所有的方法:


package com.opensymphony.xwork2;

import java.util.Collection;
import java.util.Map;

public interface ValidationAware
{
    
void setActionErrors(Collection errorMessages);
    Collection getActionErrors();

    
void setActionMessages(Collection messages);
    Collection getActionMessages();
    
void setFieldErrors(Map errorMap);
    Map getFieldErrors();
    
void addActionError(String anErrorMessage);
    
void addActionMessage(String aMessage);
    
void addFieldError(String fieldName, String errorMessage);
    
boolean hasActionErrors();
    
boolean hasActionMessages();
    
boolean hasErrors();
    
boolean hasFieldErrors();
}

关于其他更详细的验证规则,请读者访问http://struts.apache.org/2.0.11.1/docs/validation.html来查看。

struts2验证信息重复出现解决方案

你的action是不是被spring代管了?


      我一看,是啊,我的action是被spring代管了。

      接着他又写道:

      你的action class是不是用的bean 的id?

      我一边看还一边点头,是啊,我的真是这样的,怎么这么了解我!(其实人人都这样写)

      最后他说:

      把你action 的class改成全路径,问题就会得到解决。


      是吗?我当时想,那就是说不要spring代管了,那我还要向这个action 注属性的,这样改了肯定注不进去了。

      正如我所说的,这样改了验证的问题是得到解决了,可是属性注不进去了。那不是正了一样又歪了一样,问题并没有得到根本性的解决。

      正在有点想抓狂中,却无意发现我的这个bean怎么没有写scope="prototype",这个属性是告诉spring,每来一个action给我产生一个新的实例。就这么简单,问题得以真正的解决。

posted @ 2008-08-01 11:48 飞飞 阅读(530) | 评论 (0)编辑 收藏

struts.xmlstruts.properties

    其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。除此之外,Struts 2框架还包含一个struts.properties文件,该文件定义了Struts 2框架的大量属性,开发者可以通过改变这些属性来满足应用的需求。

     struts.properties文件是一个标准的Properties文件,该文件包含了系列的key-value对象,每个key就是一个Struts 2属性,该key对应的value就是一个Struts 2属性值。

      struts.properties文件通常放在Web应用的WEB-INF/classes路径下。实际上,只要将该文件放在Web应用的CLASSPATH路径下,Struts 2框架就可以加载该文件。



      其实,struts.properties文件的内容均可在struts.xml中以<constant name="" value=""></constant>加载。

下面将该文件的配置参数详细列举出来,方便大家查看;

struts.configuration

    该属性指定加载Struts 2配置文件的配置文件管理器。该属性的默认值是org.apache.Struts2.config.DefaultConfiguration,这是Struts 2默认的配置文件管理器。如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件。


struts.locale

指定Web应用的默认Locale。

struts.i18n.encoding

     指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312。

提示  当设置该参数为GBK时,相当于调用HttpServletRequest的setCharacterEncoding方法。


struts.objectFactory

    指定Struts 2默认的ObjectFactory Bean,该属性默认值是spring。

struts.objectFactory.spring.autoWrite

     指定Spring框架的自动装配模式,该属性的默认值是name,即默认根据Bean的name属性自动装配。

struts.objectFactory.spring.useClassCache

      该属性指定整合Spring框架时,是否缓存Bean实例,该属性只允许使用true和false两个属性值,它的默认值是true。通常不建议修改该属性值。



struts.objectTypeDeterminer
    该属性指定Struts 2的类型检测机制,通常支持tiger和notiger两个属性值。


 struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta。

注意  如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中。例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下。

struts.multipart.saveDir
    该属性指定上传文件的临时保存路径,该属性的默认值是javax.servlet.context.tempdir。

 struts.multipart.maxSize
该属性指定Struts 2文件上传中整个请求内容允许的最大字节数。

struts.custom.properties
    该属性指定Struts 2应用加载用户自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性。如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以英文逗号(,)隔开。

struts.mapper.class
    指定将HTTP请求映射到指定Action的映射器,Struts 2提供了默认的映射器:org.apache.struts2.dispatcher.mapper.DefaultActionMapper。默认映射器根据请求的前缀与Action的name属性完成映射。

struts.action.extension
     该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

struts.serve.static
    该属性设置是否通过JAR文件提供静态内容服务,该属性只支持true和false属性值,该属性的默认属性值是true。

struts.serve.static.browserCache
    该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。

 struts.enable.DynamicMethodInvocation
   该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。

struts.enable.SlashesInActionNames
   该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。

 struts.tag.altSyntax
   该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。

 struts.devMode
该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。

struts.i18n.reload
该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。

提示  开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。

struts.ui.theme
该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。

struts.ui.templateDir
该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。

struts.ui.templateSuffix
该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。

struts.configuration.xml.reload
该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。

struts.velocity.configfile
该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。

 struts.velocity.contexts
该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。

struts.velocity.toolboxlocation
该属性指定Velocity框架的toolbox的位置。

struts.url.http.port
该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。

struts.url.https.port
该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。

struts.url.includeParams
该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。


  struts.custom.i18n.resources
该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。


struts.dispatcher.parametersWorkaround
    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。

 struts.freemarker.manager.classname
    该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。

struts.freemarker.wrapper.altMap
该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。

 struts.xslt.nocache
    该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。

struts.configuration.files
    该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。
posted @ 2008-08-01 11:23 飞飞 阅读(163) | 评论 (0)编辑 收藏

所谓间接实现零配置,是指只要做些初始化的配置之后,在以后的开发中基本上不用在对每个Action做配置 struts.xml这样配置
    <action name="*/*" method="{2}" class="workbench.web.actions.{1}Action">
       <result name="custom">/view/{1}/${target}.jsp</result>
    </action>struts.properties的配置:
   
XML codestruts.objectFactory = spring
    struts.objectFactory.spring.autoWire = name
    struts.devMode = true
    struts.enable.DynamicMethodInvocation = false
    struts.action.extension =
    struts.enable.SlashesInActionNames = true然后写一个BaseAction:
    public abstract class BaseAction {
        protected final String CUSTOM = "custom";
        private String target;
        protected final Log logger = LogFactory.getLog(getClass());
        public String getTarget() {
            return target;
        }
        public void setTarget(String target) {
            this.target = target;
        }

        protected String render(String _target){
            setTarget(_target);
            return CUSTOM;
        }
    }
    这样其余的Action都可以直接继承BaseAction,不用再做任何配置 通过return render(target)转发到指定的jsp页面,从而间接实现零配置
    public class UserAction extends BaseAction{
        private User user;
        private UserService userService;
        public void setUserService(UserService userService) {
            this.userService = userService;
        }

        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
        public String test(){
            user = userService.get(1l);
            return render("test");
        }
    }


但是在我的SSH框架中,没能时间间接零配置,,,有那个高手帮我解决下????

posted @ 2008-08-01 10:30 飞飞 阅读(303) | 评论 (0)编辑 收藏


 @SuppressWarnings("unchecked")
 public List getAll(final int pageNow, final int pageSize) {
  final String hql = " from Mount ";
  return getHibernateTemplate().executeFind(new HibernateCallback() {

   public Object doInHibernate(Session s) throws HibernateException,
     SQLException {

    Query queryAll = s.createQuery(hql);
    queryAll.setFirstResult(pageSize * pageNow);
    queryAll.setMaxResults(pageSize);
    return queryAll.list();
   }
  });
 }

posted @ 2008-07-31 23:00 飞飞 阅读(207) | 评论 (0)编辑 收藏

仅列出标题
共12页: First 上一页 3 4 5 6 7 8 9 10 11 下一页 Last