我们在玩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年的。
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]
一样的用法,不需要任何变化
protected DepartmentService departmentService;
public void setDepartmentService(DepartmentService departmentService)
{
this.departmentService = departmentService;
}
当struts2使用spring来进行action的管理的时候,这个是会自动注入的
像你那么用也可以。。。
我的service都是设置好,让spring帮我自动注入action去。。
是从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]
[code="java"]this.managerFacade = (ManagerFacade) wac.getBean("managerFacade");[/code]
你这种用法方便是方便了点,可以不需要让spring来管理你的action,直接拿到manager,唯一的缺点就是action基本无法写单元测试。不过正常情况下如果action里面仅仅是转发,而没有业务逻辑的时候,你这种方式还是可以采纳的。
PS:我也经常这样干。
有了ServletContext,再拿到ApplicationContext就好办了把,用WebApplicationContextUtils...
那就需要你在xml里面配置action了,也就是让spring管理里的action,注入方式可以选择按类型注入。
把action配置到你的spring中,struts.properties中objectFactory=spring
struts的action这样配置:
action里面加一个setUserDAO方法就行了
也就是action里面加一个userDAO属性,给它一个set方法就可以注入了。
[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
struts.objectFactory = spring[/code]
哦,我糊涂了,BaseAction怎样写都OK,关键是你喜欢就好。
managerFacade 未注入。。
需要个set方法
BaseAction放个ManagerFacade的属性,名称和Spring中ManagerFacade的bean id一致,就可以被注入了,当然,显式的注入更明确一些。但是,struts action中class必须是bean id,不能是class名称了。
整合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
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]
呵呵,写的好累。
[quote]为啥有些时候 我提示登录请求,压根就没有进入到action,直接提示我,用户名或密错误呢? [/quote]
代码中看不出什么来,而且如你所说,没有进入action,我只是觉得你的session的用法比较陌生。
刚才忘了说:
[b]struts2的action在Spring中配置,必须把scope属性设置为prototype[/b]
[code="xml"]
[/code]
spring哪个版本?试试singleton="false"这个属性。
不如用最新的2.2.6吧,这是俺们以前的项目中的实例,现在的改annotation了。