2010-09-23 96 views
2

我将一个动态Web项目移植到Struts2,并且我需要将许多servlet转换为Struts2操作。我想使用ServletRequestAware,ServletResponseAware和SessionAware接口并保持大部分代码不变。请看看我通过GOOGLin'找到的BaseAction.java类。我想使用这个,以便我可以做其他操作来简单地扩展BaseAction。将Servlet转换为Struts2操作类

BaseAction.java

public abstract class BaseAction extends ActionSupport implements SessionAware, ServletRequestAware,ServletResponseAware, ServletContextAware{ 

private static final long serialVersionUID = 1L; 
    protected Map session; 
    protected HttpServletRequest request; 
    protected HttpServletResponse response; 

    public String execute() throws Exception { 
     return doExecute(); 
    } 

    protected abstract String doExecute() throws Exception; 

    public Map getSession() { 
     return session; 
    } 

    public void setSession(Map sess) { 
     this.session = sess; 
    } 

    public HttpServletRequest getServletRequest() { 
     return request; 
    } 

    public void setServletRequest(HttpServletRequest req){ 
     this.request = req; 
    } 

    public HttpServletResponse getServletResponse() { 
     return response; 
    } 

    public void setServletResponse(HttpServletResponse resp) { 
     this.response = resp; 
    } 

} 

现在假设我有一个servlet类似以下内容: Servlet.java

public class Servlet extends HttpServlet 
{ 
private static Logger log = Logger.getLogger(Servlet.class); 

public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException 
{ 
    HttpSession session=request.getSession(); 
Bean bean= new Bean(); 
bean.setName(request.getParameter("xxx")); 
     session.setAttribute("bean"); 
     response.sendRedirect("login.jsp"); 
     } 
} 

有人能写延长BaseAction动作类相当于Servlet? 在此先感谢。

回答

1

由于您使用Struts2的,我建议采取一切的优势框架提供的,而不是试图破解现有的servlet代码。

public class NewAction implements SessionAware { 

    private Map theSession; 
    private XXX xxx; 

    public String execute() { 
    Bean b = new Bean(); 
    b.setXXX(xxx); 
    theSession.put(b); 

    return "success"; 
    } 

    public XXX getXXX() { 
    return xxx; 
    } 

    public void setXXX(XXX xxx) { 
    this.xxx = xxx; 
    } 

    public Map getSession() { 
    return theSession; 
    } 

    public void setSession(Map session) { 
    theSession = session; 
    } 
} 

你struts.xml中应包含行动的条目:

<action name="NewAction" class="yourapp.NewAction"> 
    <result type="redirect">login.jsp</result> 
</action> 
+1

并记住Struts2为每个请求实例化一个新的Action。一个servlet实例(以及Struts 1操作)被(可能)很多请求使用,甚至可能是并发请求。 – leonbloy 2010-09-23 20:21:11

+0

非常感谢,这真是一个建议。 – Dhora 2010-09-23 21:04:43

+0

setXXX方法不需要返回任何东西。 – Dhora 2010-09-23 21:05:39

0

我希望下面的示例将帮助ü..

public class YourAction extends BaseAction { 

    private static final long serialVersionUID = -6113083300296539328L; 

    private static final Logger logger = Logger.getLogger(YourAction .class); 

    private Bean bean; 

    public String get() throws ApplicationException { 
    try { 
     this.setBean(getService().fetchBeanById(
       getHttpRequest().getParameter(
       "xxxx"))); 
    } catch (Exception e) { 
     logger.error(new String[] { " Exception listing Comment ", 
       e.toString() }); 
     throw new ApplicationException(e); 
    } 
     return SUCCESS; 
    } 

    public Bean getBean() { 
     return bean; 
    } 

    public void setBean(Bean bean) { 
     this.bean= bean; 
    } 
} 
+0

ThanQ,但1件事就是获取和设置请求参数和会话的HTTP东西是由Struts2框架容易处理对我而言仍然不清楚。我可以通过getServletRequest.getParameter(“xxxx”)获得表单字段值;现在,我如何使用SessionAware接口将bean设置为会话。我是否必须将该bean放入地图中,然后struts是否负责其余部分?或者,我可以使用HttpSession ses = new HttpSession(); – Dhora 2010-09-23 21:01:15

+0

((HttpServletRequest)ActionContext.getContext()。get( \t \t \t \t StrutsStatics.HTTP_REQUEST)).getSession();会给你会话对象。 – Jothi 2010-09-30 10:34:06