【问题标题】:Annotation support in Struts 2Struts 2 中的注解支持
【发布时间】:2009-04-24 17:27:59
【问题描述】:

我目前正在评估 Struts 2。官方文档包含一个带有以下 Java 和 JSP 代码的 HelloWorld 示例:

Java

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

    public static final String MESSAGE = "Struts is up and running ...";

    public String execute() throws Exception {
        setMessage(MESSAGE);
        return SUCCESS;
    }

    private String message;

    public void setMessage(String message){
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

JSP

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

<html>
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h2><s:property value="message" /></h2>
    </body>
</html>

该示例使用以下 XML 文件来指定此操作的 URL,并将操作和视图绑定在一起

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="tutorial" extends="struts-default">
        <action name="HelloWorld" class="tutorial.HelloWorld">
            <result>/HelloWorld.jsp</result>
        </action>
    </package>
</struts>

我的问题(最后)是:这真的是 Struts2 的最新技术吗?我一直认为 XML 配置和子类化特定基类 (ActionSupport) 的必要性已被弃用。我认为注释可以用于配置。

几个更具体的问题:

  • 是否需要为每种请求类型设置一个 Action 类,或者是否可以在一个 eaction 中定义多个方法,每个方法可以处理不同的请求?
  • 是否有必要为您希望对视图提供的数据成员(上例中的“消息”)定义公共 getter 和 setter?

如果这是 Struts2 中的最新技术,那么它似乎对 Struts1 没有太大的改进,但我怀疑这只是一个不好的例子。

谢谢, 唐

【问题讨论】:

    标签: java struts2 web-frameworks


    【解决方案1】:

    一些答案​​(不是全部):

    • 您可以将多个方法添加到同一个 Action 类。每个都需要返回一个字符串。
    • 我认为需要公共 getter 和 setter。
    • 提供的基类只定义了某些有用的值,例如常量 SUCCESS。

    您可以通过“零配置”功能(zero conf doc)使用注释

    【讨论】:

      【解决方案2】:

      例子是老式的struts2。正如@pgb 所说,您几乎可以对所有内容使用注释。

      还有 2 种不同风格的配置可供选择;一种叫“约定”,一种叫“注解”。约定受 Rails 影响,并通过路径/命名在操作和结果之间创建默认绑定。使用注释可以声明所有内容,就像使用 xml 一样,但仅限于控制器类中。我发现两者都是很好的简化,并且目前只为大型网站运行一个很小的 ​​xml 文件。

      【讨论】:

      【解决方案3】:

      很抱歉缺少资源,但我无法在此处复制和粘贴。

      但这应该让您了解 2.1.x 的功能。

      struts.xml:

      <!DOCTYPE struts PUBLIC 
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
      <struts>
          <!-- Include webwork default (from the Struts JAR). -->
          <include file="struts-default.xml"/>
          <!-- Configuration for the default package. -->
          <package name="default" extends="struts-default">
              <interceptors>
                  <interceptor name="appLogin" class="us.pdinc.client.com.usgoldnetwork.support.struts.LoginInterceptor" />   
                  <interceptor-stack name="loginStack">
                      <interceptor-ref name="appLogin"/>
                      <interceptor-ref name="paramsPrepareParamsStack"/>
                  </interceptor-stack>
              </interceptors>     
              <!-- Default interceptor stack. -->
              <default-interceptor-ref name="loginStack"/>        
              <global-results>
                  <result name="login">/WEB-INF/jsp/login-input.jsp</result>
              </global-results>
          </package>
      </struts>
      <!--  http://struts.apache.org/2.1.6/docs/convention-plugin.html  -->
      

      struts.properties:

      struts.custom.i18n.resources=guest
      struts.convention.result.path=/WEB-INF/jsp
      struts.ognl.allowStaticMethodAccess=true
      

      AddrAction.java

          package us.pdinc.client.com.usgoldnetwork.action;
      
      import java.util.List;
      
      import javax.servlet.http.HttpServletRequest;
      
      import org.apache.struts2.convention.annotation.Result;
      import org.apache.struts2.convention.annotation.Results;
      import org.apache.struts2.interceptor.ServletRequestAware;
      import org.hibernate.Session;
      import org.hibernate.Transaction;
      
      import us.pdinc.client.com.usgoldnetwork.beans.model.hibernate.Addr;
      import us.pdinc.client.com.usgoldnetwork.beans.model.hibernate.AddrType;
      import us.pdinc.client.com.usgoldnetwork.beans.model.hibernate.Tx;
      import us.pdinc.client.com.usgoldnetwork.servlet.support.RequestScopeHibernateSession;
      
      import com.opensymphony.xwork2.ActionSupport;
      import com.opensymphony.xwork2.Preparable;
      
      @Results({
            @Result(name="list", type="redirect", location="/addr", params={"transaction.id","${transaction.id}"})
          })
      public class AddrAction extends ActionSupport implements Preparable , ServletRequestAware 
      {
          private static final long serialVersionUID = 1L;
      
          private List<Addr> addrs;
          private List<AddrType> addrTypes;
          private List<Tx> txs;
          private Addr addr;
          private AddrType addrtype;
          private HttpServletRequest httpServletRequest;
          private Tx transaction;
          long txId = 0;
      
          @Override
          public void prepare() throws Exception
          {
              if (addr!=null && addr.getId()!=null) 
                  {
                      Session session = RequestScopeHibernateSession.getSession(httpServletRequest);
                      addr=(Addr) session.get(Addr.class, addr.getId());
                  }
          }
      
          public String index()
          {
              return list();
          }
      
          public String list()
          {
              System.out.println("LIST");
              if (transaction==null)throw new RuntimeException();
              if (transaction.getId()==null) throw new RuntimeException();
              if (transaction.getId()<=0) throw new RuntimeException();
              Session session = RequestScopeHibernateSession.getSession(httpServletRequest);
              transaction=(Tx)session.get(Tx.class, transaction.getId());
              addrs=transaction.getAddrs();
      
              return SUCCESS;
          }
      
          public String input() 
          {
              Session session = RequestScopeHibernateSession.getSession(httpServletRequest);
              addrTypes=session.createCriteria(AddrType.class).list();
              //txs = session.createCriteria(Tx.class).list();
              return INPUT;
          }
      
          public String save() 
          {
              System.out.println("SAVE");
      
              if(transaction != null && transaction.getId() != null){
                  txId = transaction.getId();
              }
              if(addr != null && addr.getTx() != null && addr.getTx().getId() != null){
                  txId = addr.getTx().getId();
              }
              /*if (transaction==null || addr == null)throw new RuntimeException();
              System.out.println("******************************************************************");
              System.out.println("Transaction value ==" + transaction);
              System.out.println("Addr value ==" + addr);
              if (addr.getTx() == null) throw new RuntimeException();
              System.out.println("Transaction ID value ==" + transaction.getId());
              System.out.println("Addr Transaction value ==" + addr.getTx());
              if ( addr.getTx().getId() == null ) throw new RuntimeException();
              System.out.println("********************************************************************");
              System.out.println("Addr Transaction ID value ==" + addr.getTx().getId());*/
      
              Session session = RequestScopeHibernateSession.getSession(httpServletRequest);
              transaction=(Tx)session.get(Tx.class, txId);
              //String addrTypeId = httpServletRequest.getParameter("addr.addrType.id");
              //Long Id = Long.valueOf(addrTypeId);
              addrtype=(AddrType) session.get(AddrType.class, addr.getAddrType().getId());
              if (addr.getId()==null)
              {   
                  System.out.println("Addr is null");
                  addr.setTx(transaction);
                  addr.setAddrType(addrtype);
                  Transaction tx = session.getTransaction();
                  tx.begin();
                  session.save(transaction);
                  session.persist(addr);
                  tx.commit();
              }
              else
              {
                  System.out.println("Addr is not null");
                  Transaction tx = session.getTransaction();
                  tx.begin();
                  session.update(addr);
                  tx.commit();        
              }
              return "list";
          }
      
      
      
          public String delete() 
          {
              Session session = RequestScopeHibernateSession.getSession(httpServletRequest);
              Transaction tx = session.getTransaction();
              tx.begin();
              session.delete(session.get(Addr.class, addr.getId()));
              tx.commit();        
              return "list";
          }
      
      
          @Override
          public void setServletRequest(HttpServletRequest arg0)
          {
              httpServletRequest=arg0; 
          }
      
          public Addr getAddr()
          {
              return addr;
          }
      
          public void setAddr(Addr addr)
          {
              this.addr = addr;
          }
      
          public List<Addr> getAddrs()
          {
              return addrs;
          }
      
          public List<AddrType> getAddrTypes()
          {
              return addrTypes;
          }
      
          public List<Tx> getTxs()
          {
              return txs;
          }
      
          public Tx getTransaction() {
              return transaction;
          }
      
          public void setTransaction(Tx transaction) {
              this.transaction = transaction;
          }
      
      }
      

      addr.jsp:

      <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="ISO-8859-1"%>
      <%@ taglib prefix="s" uri="/struts-tags" %>
      <html>
      <head>
          <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
          <link href="<s:url value='/css/main.css'/>" rel="stylesheet" type="text/css"/>
          <title>Addresses Screen</title>
             <jsp:include page = "barcodeextractor.jsp" />
      </head>
      <body>
      <div class="titleDiv">USGN Core Process</div>
      <h1>Addresses</h1>
      <s:url id="url" action="addr!input" >
      <s:param name="transaction.id" value="transaction.id" />
      </s:url>
      <a href="<s:property value="#url"/>">Add New Address</a>
      <br/><br/>
      <table class="borderAll">
          <tr>
              <th>Customer</th>
              <th>Name</th>
              <th>Type</th>
              <th>Street 1</th>
              <th>Street 2</th>
              <th>Street 3</th>
              <th>Street 4</th>
              <th>Street 5</th>
              <th>Street 6</th>
              <th>City</th>
              <th>State</th>
              <th>Postal</th>
              <th>Country</th>
              <th>&nbsp;</th>
          </tr>
          <s:iterator value="addrs" status="status">
              <tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>">
                  <td class="nowrap"><s:property value="tx.id"/></td>
                  <td class="nowrap"><s:property value="name"/></td>
                  <td class="nowrap"><s:property value="addrType.addrType"/></td>
                  <td class="nowrap"><s:property value="street1"/></td>
                  <td class="nowrap"><s:property value="street2"/></td>
                  <td class="nowrap"><s:property value="street3"/></td>
                  <td class="nowrap"><s:property value="street4"/></td>
                  <td class="nowrap"><s:property value="street5"/></td>
                  <td class="nowrap"><s:property value="street6"/></td>
                  <td class="nowrap"><s:property value="city"/></td>
                  <td class="nowrap"><s:property value="state"/></td>
                  <td class="nowrap"><s:property value="postal"/></td>
                  <td class="nowrap"><s:property value="country"/></td>
                  <td class="nowrap">
                      <s:url action="addr!input" id="url">
                          <s:param name="addr.id" value="id"/>
                      </s:url>
                      <a href="<s:property value="#url"/>">Edit</a>
                      &nbsp;&nbsp;&nbsp;
                      <s:url action="addr!delete" id="url" >
                          <s:param name="addr.id" value="id"/>
                      </s:url>
                      <a href="<s:property value="#url"/>">Delete</a>
                  </td>
              </tr>
          </s:iterator>
          </table>
      </body>
      </html>
      

      addr-input.jsp:

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="s" uri="/struts-tags" %>
      <s:if test="addr==null || addr.id == null">
          <s:set name="title" value="%{'Add new contact type'}"/>
      </s:if>
      <s:else>
          <s:set name="title" value="%{'Update contact type'}"/>
      </s:else>
      
      <html>
      <head>
          <link href="<s:url value='/css/main.css'/>" rel="stylesheet" type="text/css"/>
          <style>td { white-space:nowrap; }</style>
          <title><s:property value="#title"/></title>
           <jsp:include page = "barcodeextractor.jsp" />
      </head>
      <body>
      <div class="titleDiv">USGN Core Process</div>
      <h1><s:property value="#title"/></h1>
      <s:actionerror />
      <s:actionmessage />
      <s:form action="addr!save" method="post">
          <s:select name="addr.addrType.id" label="Address Type" list="addrTypes" listKey="id" listValue="addrType" value="%{addr.addrType.id}"/>
          <s:textfield name="addr.name" value="%{addr.name}" label="Name" size="40"/>
          <s:textfield name="addr.street1" value="%{addr.street1}" label="Street 1" size="40"/>
          <s:textfield name="addr.street2" value="%{addr.street2}" label="Street 2" size="40"/>
          <s:textfield name="addr.street3" value="%{addr.street3}" label="Street 3" size="40"/>
          <s:textfield name="addr.street4" value="%{addr.street4}" label="Street 4" size="40"/>
          <s:textfield name="addr.street5" value="%{addr.street5}" label="Street 5" size="40"/>
          <s:textfield name="addr.street6" value="%{addr.street6}" label="Street 6" size="40"/>
          <s:textfield name="addr.city" value="%{addr.city}" label="City" size="40"/>
          <s:textfield name="addr.state" value="%{addr.state}" label="State" size="40"/>
          <s:textfield name="addr.postal" value="%{addr.postal}" label="Postal" size="40"/>
          <s:textfield name="addr.country" value="%{addr.country}" label="Country" size="40"/>
          <s:hidden name="addr.id" value="%{addr.id}"/>
          <s:hidden name="transaction.id" value="%{transaction.id}"/>
          <s:submit value="Submit"/>
          <s:submit value="Cancel" name="redirectAction:addr!list"/>
      </s:form>
      </body>
      </html>
      

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        相关资源
        最近更新 更多