zybzhen
2008-11-11 10:05
浏览 513
已采纳

struts2 BaseAction该如何写

我们在玩struts1的时候,通常都会 extends Action 然后写一个public void setServlet(ActionServlet actionServlet) {
this.managerFacade = (ManagerFacade) wac.getBean("managerFacade");}

每个action都继承这个action,省去了每个action都得setDAO的代码。

这样的功能 在struts2中该如何实现呢?

[b]问题补充:[/b]
大家回答的有点太深奥了
没看懂(文化程度有限,高中都没读过)

说struts2和spring天然 结合
是什么概念?

我用了spring,也用了hibernate

用了spring Bean工厂

我的action和daoImpl 在applicationContext.xml都有配置

是不是 我的action中可以直接拿到dao对像,而不用 在写setdao了?

比如我的loginAction,我在spring中有一个userdao
我在loginAction中是不是可以 直接使userdao中的方法,不用setdao?
如何搞?
[b]问题补充:[/b]
to:上一站,火星

我的spring配置文件是这样的

<bean id="userDAO" class="user.DAOImpl"
<bean id="loginAction" class="com.LoginAction

我struts配置文件
<action name="loginAction class="loingAction"

我的配置文件如何改 才能类型注入,
我的action中怎么直接使dao中的方法
[b]问题补充:[/b]
我的LoginAction
public class LoginAction extends ActionSupport{

private static final long serialVersionUID = 7592871230236282753L;
private ManagerFacade managerFacade; 
private String userId;
private String userPassword;

@SuppressWarnings("unchecked")
public String execute(){
    String status = "success";
    User user = null;
    if (!"".equals(this.getUserId()) && null != this.getUserPassword()){
         user = managerFacade.getUserByUserId(userId);
    }

}

怎程序运行到managerFacade.getUserByUserId(userId);这句就报错。
空指针错误。
可能是哪里出的问题?
[b]问题补充:[/b]
public void setManagerFacade(ManagerFacade managerFacade) {
this.managerFacade = managerFacade;
}
写了set方法。
[b]问题补充:[/b]
cats_tiger 写得4条中,只有第3条我没看懂。

我这样写的。


我在struts配置中用的是beanid

可是我 用了报告必须写ref
我不知道ref和name都应该写啥。
是都写 dao的名字吗?
[b]问题补充:[/b]
感谢cats_tiger。搞定了。
没有分了,不能在发贴子问我的login不成功的问题。

只能在这里问了。

为啥有些时候 我提示登录请求,压根就没有进入到action,直接提示我,用户名或密错误呢?
public class LoginAction extends ActionSupport{

private static final long serialVersionUID = 7592871230236282753L;
private ManagerFacade managerFacade; 
private static String userId;
private static String userPassword;

@SuppressWarnings("unchecked")
public String execute() throws Exception{
    String status = "success";
    User user = null;
    if (!"".equals(this.getUserId()) && null != this.getUserPassword()){
         user = managerFacade.getUserByUserId(userId);
    }
    if (validateUser(user,this.getUserPassword())){
        ActionContext.getContext().getSession().put(Constant.SESSION_USER_KEY, user);//将登录的用户信息存入到session中
        ActionContext.getContext().getSession().put(Constant.SESSION_USER_PERMISSION,permissionList );
        status = "success";
    }else{
        addFieldError("userPassword",getText("login.error"));
        status = "input";
    }
    return status;
}

我的loginAction代码在此。省略了 getter/setter.

[b]问题补充:[/b]
写完 scope="prototype"之后报告这个错误。
Attribute "scope" must be declared for element type "bean".
而且myeclipse也把scope标红了。

把session那段代码删掉,删掉发布,重起计算机,在起tomcat
也有这个问题。

[b]问题补充:[/b]
我用的是spring2.5.5
这么一问,我仔看了一下,怎我的spring.jar 里的class文件都04年的。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

19条回答 默认 最新

  • catstiger 2008-11-11 14:41
    已采纳

    2.0以后就支持了,看看xml对吗?
    [code="xml"]
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

    [/code]
    或者:
    [code="xml"]
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
    default-autowire="byName" default-lazy-init="true">

    [/code]

    已采纳该答案
    打赏 评论
  • iteye_14081 2008-11-11 10:07

    一样的用法,不需要任何变化

    打赏 评论
  • 小毛1983 2008-11-11 10:07

    protected DepartmentService departmentService;
    public void setDepartmentService(DepartmentService departmentService)
    {
    this.departmentService = departmentService;
    }

    当struts2使用spring来进行action的管理的时候,这个是会自动注入的

    打赏 评论
  • 小毛1983 2008-11-11 10:08

    像你那么用也可以。。。
    我的service都是设置好,让spring帮我自动注入action去。。

    打赏 评论
  • catstiger 2008-11-11 10:10

    是从spring中取得bean吗?struts2和spring天然结合,需要加入struts-spring-plugin-xxx.jar
    然后ObjectFactory设置为spring
    也可以从ActionContext获得Request,ServletContext等对象:
    [code="java"]
    protected final ActionContext getActionContext() {
    return (actionContext == null) ? actionContext = ActionContext
    .getContext() : actionContext;
    }
    /**
    * 获得当前Http Servlet Request.
    * 如果在单元测试环境下,则每次调用都返回一个新的MockHttpServletRequest的实例
    */
    protected final HttpServletRequest getRequest() {
    HttpServletRequest request = null;
    if (getActionContext() != null) { // 从Struts2中取得Request
    request = (HttpServletRequest) getActionContext().get(
    StrutsStatics.HTTP_REQUEST);
    }

        return request;
    }
    

    protected final ServletContext getServletContext() {
    ServletContext ctx = (ServletContext) getActionContext().get(
    StrutsStatics.SERVLET_CONTEXT);

        return ctx;
    }
    

    [/code]

    打赏 评论
  • iteye_14081 2008-11-11 10:14

    [code="java"]this.managerFacade = (ManagerFacade) wac.getBean("managerFacade");[/code]
    你这种用法方便是方便了点,可以不需要让spring来管理你的action,直接拿到manager,唯一的缺点就是action基本无法写单元测试。不过正常情况下如果action里面仅仅是转发,而没有业务逻辑的时候,你这种方式还是可以采纳的。

    PS:我也经常这样干。

    打赏 评论
  • catstiger 2008-11-11 10:19

    有了ServletContext,再拿到ApplicationContext就好办了把,用WebApplicationContextUtils...

    打赏 评论
  • iteye_14081 2008-11-11 10:32

    那就需要你在xml里面配置action了,也就是让spring管理里的action,注入方式可以选择按类型注入。

    打赏 评论
  • catstiger 2008-11-11 10:40

    把action配置到你的spring中,struts.properties中objectFactory=spring
    struts的action这样配置:

    打赏 评论
  • iteye_14081 2008-11-11 10:41

    action里面加一个setUserDAO方法就行了

    打赏 评论
  • iteye_14081 2008-11-11 10:42

    也就是action里面加一个userDAO属性,给它一个set方法就可以注入了。

    打赏 评论
  • 小毛1983 2008-11-11 10:43

    [code="xml"]<?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">

    extends="defaults">
    class="com.hnjk.gdpolice.admin.user.actions.UserAction">

    /admin/user/index.jsp


    class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="create">

    /admin/user/index.action

    /admin/user/new.jsp

    class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="edit">

    /admin/user/edit.jsp


    class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="update">

    /admin/user/index.action

    /admin/user/edit.jsp

    class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="remove">

    /admin/user/index.action


    class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="login">
    /index.jsp
    /index.jsp


    class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="logout">
    /index.jsp




    [/code]

    另外,struts.properties中配置
    [code="java"]### if specified, the default object factory can be overridden here

    Note: short-hand notation is supported in some cases, such as "spring"

    Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here

    struts.objectFactory = spring[/code]

    打赏 评论
  • catstiger 2008-11-11 10:53

    哦,我糊涂了,BaseAction怎样写都OK,关键是你喜欢就好。

    打赏 评论
  • 小毛1983 2008-11-11 11:02

    managerFacade 未注入。。

    需要个set方法

    打赏 评论
  • catstiger 2008-11-11 11:11

    BaseAction放个ManagerFacade的属性,名称和Spring中ManagerFacade的bean id一致,就可以被注入了,当然,显式的注入更明确一些。但是,struts action中class必须是bean id,不能是class名称了。

    打赏 评论
  • catstiger 2008-11-11 11:14

    整合struts2和spring:
    1.classpath加入struts-spring-plugin.jar
    2.struts.properties中struts.objectFactory=spring
    3.将Action类作为Spring的Bean,所用到的Manager和DAO都注入,初学者建议使用显式注入。
    4.struts.xml中acition节点的class属性指向对应的Spring的Bean ID

    打赏 评论
  • catstiger 2008-11-11 11:30

    name是Action中属性名字,区分大小写
    ref是被注入的bean 的bean ID
    例如:
    [code="java"]
    public class YourDao {
    }

    public class MyAction {
    private YourDao yourDao;
    //get...
    //set
    }
    [/code]
    Spring XML:
    [code="xml"]


    [/code]
    Struts XML
    [code="xml"]

    [/code]
    呵呵,写的好累。

    打赏 评论
  • catstiger 2008-11-11 13:53

    [quote]为啥有些时候 我提示登录请求,压根就没有进入到action,直接提示我,用户名或密错误呢? [/quote]
    代码中看不出什么来,而且如你所说,没有进入action,我只是觉得你的session的用法比较陌生。
    刚才忘了说:
    [b]struts2的action在Spring中配置,必须把scope属性设置为prototype[/b]
    [code="xml"]

    [/code]

    打赏 评论
  • catstiger 2008-11-11 14:16

    spring哪个版本?试试singleton="false"这个属性。
    不如用最新的2.2.6吧,这是俺们以前的项目中的实例,现在的改annotation了。



    打赏 评论

相关推荐 更多相似问题