谁奉献一下,分享下struts2下载 的BaseAction

中国领先的IT技术网站
51CTO旗下网站
BaseAction基类介绍
《30天学通Java Web项目案例开发》第3章东城大学在线答疑系统(Struts2+Spring+MySQL实现共6300行代码),本章将通过一个具体的案例--东城大学在线答疑系统,介绍此类答疑系统的开发。本节为大家介绍BaseAction基类。
作者:吴亚峰/索依娜来源:电子工业出版社| 10:40
3.6& 用户登录和注册
前几节详细介绍了一些文件的配置,包括数据源、Spring、Struts,以及它们的集成,本节将进入代码开发阶段。首先开发注册页面,该页面开发完的效果如图3-16所示。
(点击查看大图)图3-16& 注册页面
3.6.1& BaseAction基类介绍
在使用Struts2开发的过程中,有时候一个动作要对应到一个Action,但是这些Action中有些属性或方法是相同的,例如都要用到访问数据库的Bean等,如果在每个Action里重复书写,代码就显得冗长而乏味,所以首先定义一个基类Action,包含一些通用的属性和方法,以后每个Action集成它即可。即BaseAction基类,具体代码如下所示。
代码位置:见光盘本章源代码的DYBaseAction.java类。1&&&public&class&DYBaseAction&extends&ActionSupport{ &2&&&&&&&protected&DBUtil&&&&&&&&&&&&&&&&&3&&&&&&&protected&String&&&&&&&&&&&&&4&&&&&&&protected&String&&&&&&&&&&&&&&&&&5&&&&&&&&protected&&String&actionS&&&&&&&&6&&&&&&&public&void&setDbu(DBUtil&dbu){ &7&&&&&&&&&&&this.dbu&=&&&&&&&&&&&&&&&&&&&8&&&&&&&} &9&&&&&&&public&Map&getSession(){&&&&&&&&&&&&&10&&&&&&&&&&return&ActionContext.getContext().getSession(); &11&&&&&&} &12&&&&&&public&String&getMessage(){ &13&&&&&&&&&&return&&&&&&&&&&&&&&&14&&&&&&} &15&&&&&&public&String&getUrl(){&&&&&&&&&&16&&&&&&&&&&return& &17&&&&&&} &18&&&&&&public&String&getActionStr()&{&&&&&&&19&&&&&&&&&&return&actionS &20&&&&&&} &21&&&&&&public&void&setActionStr(String&actionStr)&{ &22&&&&&&&&&&this.actionStr&=&actionS&&23&&&&&&} &24&&&&&&@Override&&&&&&&&&&&&&&&&&&&&&&&&&&&&25&&&&&&public&String&execute()throws&Exception{ &26&&&&&&&&&&String&result&=&SUCCESS; &27&&&&&&&&&&if("logout".equals(actionStr)){&&28&&&&&&&&&&&&&&String&role&=&(String)getSession().get("role");&&29&&&&&&&&&&&&&&getSession().clear();&&&&&&&&&&&&30&&&&&&&&&&&&&&System.out.println("role:=="+role); &31&&&&&&&&&&&&&&if("0".equals(role)||"1".equals(role)){&&&32&&&&&&&&&&&&&&&&&&url&=&"IndexAction.action"; &33&&&&&&&&&&&&&&&&&&message&=&"退出成功,现在将跳转到主页";&34&&&&&&&&&&&&&&} &35&&&&&&&&&&&&&&else{&&&&&&&&&&&&&&&&&&&&&&&&36&&&&&&&&&&&&&&&&&&url&=&"adminLogin.jsp"; &37&&&&&&&&&&&&&&&&&&message&=&"退出成功,现在将要跳转到登录页";&&38&&&&&&&&&&&&&&&&&&result&=&LOGIN;&&&&&&&&&&39&&&&&&&&&&}} &40&&&&&&&&&&return&&&&&&&&&&&&&&&&&&&&41&&}}&
第2~5行为该BaseAction的几个属性,如访问数据库的DBUtil类的引用、给用户提示消息字符串message等和用户请求动作标识字符串actionStr等。
第6~7行为dbu属性的依赖注入的setter方法,Spring会为该Action自动注入DBUtil实例。
第9~23行为这些属性的一些setter和getter方法,其中还包括得到Struts里模拟HttpSession实例的Map对象的方法,因为在有些action中要访问到session。
第25~41行为重写了父类的execute方法,其中对注销动作做了处理,如清空session并根据用户登录的身份来给出不同提示信息并跳转到不同的页面。
开发完基类Action后,由于该action实现了注销动作,所以应该在struts.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"& &&struts&&&&& &&&&&&package&name="mydefault"&extends="struts-default"& &&&&&&&&&&&&&&action&name="DYAction"&class="wyy.DYBaseAction"& &&&&&&&&&&&&&&&&!--如果返回success视图则进入message.jap页面--& &&&&&&&&&&&&&&result&name="success"&/message.jsp&/result& &&&&&&&&&&&&&&&&!--如果返回success视图则进入adminMessage.jap页面--& &&result&name="login"&/adminMessage.jsp&/result& &&&&&&&&&&/action& &&&&&&/package& &&/struts&&
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:119874人学习过
讲师:125681人学习过
讲师:172114人学习过
精选博文论坛热帖下载排行
本书根据教育部考试中心2004年最新发布的《全国计算机等级考试大纲》编写,针对计算机等级考试三级网络技术各方面的考点进行讲解和训练。本...
订阅51CTO邮刊博客分类:
1,Result原理
1) Result组件是Struts2中用于输出的组件,实际上就是Java代码。
2)Struts2中预制了10中类型的Result,这些Result什么在struts-default.xml中。
这些类实际上都事先了统一的接口:Result.
&result-types&
&result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/&
&result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/&
&result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/&
&result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/&
&result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/&
&result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/&
&result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/&
&result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/&
&result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/&
&result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /&
&/result-types&
3)重点讲解一下类型的Result
--dispatcher
(默认类型,转发到一个页面)
当一个请求到来,服务器直接转发到另一个页面,不能是另一个action。由于这个过程在服务器内部完成,客户端(浏览器)并不知道,所以在地址栏不会显示真实访问的页面,而显示都是所请求的action的地址。在servlet中相当与forword转发。
--redirect
(重定向到一个页面)。
当一个请求到来,服务端将实际地址response给浏览器,然后浏览器重新发起请求,这个过程,浏览器是知道访问的页面的实际地址的,所以在浏览器的地址栏显示的是实际访问的jsp页面地址。但是这种类型不能重定向到一个action.
转发到一个action,而不是页面
--redirectAction 重定向到一个action
跳转到其他包的action:
&action name="login" class="..."&
&!-- Chain to another namespace --&
&result type="chain"&
&param name="actionName"&dashboard&/param&
&param name="namespace"&/secure&/param&
使用redirectAction 带参数
&action name="temp" class="com.lydia.web.action.TempAction"&
&result type="redirectAction"&
&param name="actionName"&test.action&/param&
&param name="name"&${name}&/param&
4)使用方式
&result name="ok" type="类型"&
2、Stream类型的Result详解
1)Stream是用于向页面直接输出二进制数据,比如登陆页面的验证码图片,就可以在服务端生成,然后由这种类型的Result输出
&result name="success" type="stream"&
&param name="inputName"&
输出属性名
--在struts.xml中,我们可以使用param来给组件的属性注入默认值
--&param name="inputName"&,这里inputName对应的是StreamResult的inputName属性,这样配置相当于会调用StreamResult的setInputName方法给它注入属性值。
--注入的属性值,是Action中的某个属性的名称,如下图,inputName是StreamResult中的一个属性。在Action中作二进制输出的属性要求其类型为InputStream。
-- Result会创建一个输出流,接到Action中的输入流,向页面输出。
3) 验证码案例:
struts.xml中配置:
&!-- 生成验证码的Action --&
&action name="createImage"
class="com.netctoss.action.CreateImageAction"&
&result name="success" type="stream"&
&param name="inputName"&
imageStream
CreateImageAction.java
public class CreateImageAction
extends BaseAction {
private InputStream imageS
public String execute() {
//生成验证码图片
Map&String,BufferedImage& map =
ImageUtil.createImage();
//通过遍历得到唯一生成的验证码
String imageCode =
map.keySet().iterator().next();
//将验证码记录到session,在登录验证时使用
session.put("imageCode", imageCode);
//根据验证码,得到图片
BufferedImage image = map.get(imageCode);
//将图片转换为输入流,由result作输出
imageStream =
ImageUtil.getInputStream(image);
} catch (IOException e) {
e.printStackTrace();
return "error";
return "success";
public InputStream getImageStream() {
return imageS
public void setImageStream(InputStream imageStream) {
this.imageStream = imageS
&script language="javascript" type="text/javascript"&
function change(imageObj) {
imageObj.src = "createImage?date=" + new Date().getTime();
&td class="login_info"&验证码:&/td&
&td class="width70"&&input name="code" type="text" class="width70" /&&/td&
&td&&img src="createImage" alt="验证码" title="点击更换" onclick="change(this);"/&&/td&
&td&&span class="required"&&/span&&/td&
BaseAction.java 实现接口SessionAware
* 所有Action的父类,可以将通用的代码
* 提取出来放到父类中。
* 这里,我们让BaseAction实现接口SessionAware,
* 那么继承与BaseAction的Action就相当于实现了
* 这个接口。在实例化Action之后,Struts2会自动
* 调用setSession方法把session注入给Action,
* 这里我们利用全局变量session来接收,Action
* 可以在调用业务方法时使用它来调用session。
public class BaseAction implements SessionAware {
protected Map&String, Object&
public void setSession(Map&String, Object& session) {
this.session =
3、Json类型的Result详解
1) 向页面输出json格式的字符串
2) struts2 并没有预制这种类型的Result,但是他非常常用,往往用于页面的异步校验。
3) 使用步骤
a,导包:struts2-json-plugin-2.1.8.1.jar
b,struts.xml中将要使用json类型Result的package继承json-default
c,在struts.xml中配置result
--最常用,只是输出单个属性
&result name="success" type="json" &
&param name="root"&
指定Action的一个属性名
注意: name="root"是固定用法;
如指定的属性是boolean类型,那么Result会把这个属性做成字符串"true";
如指定的属性是JavaBean,那么Result会把这个属性做成字符串{"code":"12"}
--输出多个属性
&result name="success" type="json"&
&param name="includeProperties"&
属性名1,属性名2,...
注意:Result会将这一组属性做成一个json输出,
如Action中有属性code="aaa",name="zs"
可以将这2个属性做成一个json
{"code":"aaa","name":"zs"}
--输出Action中的所有属性
&result name="success" type="json"&
注意:Result会将Action中所有的属性做成一个
json输出{"":"","":""}
浏览 26420
浏览: 238589 次
来自: 武汉
写的很仔细, 谢谢分享
请问下,&bean class=&org.my ...
经典整合推荐一个实例下载:http://blog.sina.c ...
额 大致有点了解
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
使用Struts2或webwork2有一段时间了,想把Struts2框架的思路简单的与大家分享一下,之前我是看过Struts2源代码的,所以本文算是它的一个功能非常有限的压缩版本。我也不打算重复发明轮子,只想让Struts2或Webwork2的新手更多的了解框架本身,而不仅仅是应用。废话少说,开始吧。
本文采用基本Xml来配置Action,如果有时间会继续写Annotation的实现。Xml文件结构与Struts2的配置文件struts.xml几乎一样,这样大家都比较熟悉,不过我简写了某些地方:
Struts.xml
&?xml version="1.0" encoding="UTF-8" ?&
&!-- 为简化框架,package的属性都没有实现;而且所有的元素都是简化版的 --&
&action name="hello" method="hello"
class="com.leo.action.HelloAction"&
&result name="success"&/index.jsp&/result&
&/package&
是不是很熟悉啊,不过为了简单我都给简化了,否则这是一个没有尽头的工作。核心部分仍然是Filter,Struts2所有工作都是通过一个Filter来完成的(struts1.*是通过一个Action实现的)。我们先来看代码:
public class StrutsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)
HttpServletResponse response = (HttpServletResponse)
ServletContext servletContext = filterConfig.getServletContext();
// 解析Request的URL和传过来的参数
String actionName = StringUtil.parseServletPath(request
.getServletPath());
// 如果后缀不为.action,那么直接放过,不进行拦截
if (StringUtil.isEmpty(actionName)) {
chain.doFilter(request, response);
// 解析得到ActionClass,里面包括Action的类全名,返回页面值,Action执行的方法
ActionClass clas = this.getActionClass(actionName);
// 得到页面的所有parameters参数(没考虑上传情况)
Map&String, String[]& params = request.getParameterMap();
// 为要调用的Action的set**方法设值,并返回要调用的Action对象本身
setBeforeActionValue(clas, params);
// 调用的Action执行方法,并返回值设置在request域中
setResultValue(clas, request);
// 返回相应的JSP页面
servletContext.getRequestDispatcher(clas.getResult()).forward(
request, response);
没错一些因果都因doFilter方法而起。我的作法是:
解析URL路径,从而得到相应action在struts.xml配置文件中所配置的方法。如果不为合法的action后缀,直接chain.doFilter(request, response)放行。
将URL上的参数通过request.getParameterMap()取出,在调用action执行方法之前,将具有set**属性的字段赋值。这里利用了反射。
继续利用反射,执行Action的方法。结束前将具有get**属性的字段存于request域中,供页面使用。大家记得在每次执行Action的方法时都会返回一个String字符串,比如SUCCESS,INPUT,ERROR等,我们可以将这个值与struts.xml的&result name="success" ....&/index.jsp&/result& 结点进行匹配,取出返回页面/index.jsp
一切准备就绪后,调用servletContext.getRequestDispatcher().forward()方法到相应的页面上去。
这就是大概的流程。因为是一个入门的框架所以很不完善,拦截器,result type的各种类型都没有去实现,因为我压根没想过要重复发明轮子。好,我们开始一步一步的看。
我们先来看这一句:ActionClass clas = this.getActionClass(actionName);其中ActionClass的结构如下:
public class ActionClass {
private String classN
* 要调用的方法名
* 返回结果页面
* 临时存储Action下的所有result结点
private List&Element& elements = new ArrayList&Element&();
* 要调用的Action本身
//省略所有的set,get方法
ActionClass主要是用来存放解析struts.xml文件一些有用的值,以及反射时所调用的Action本身对象,其实就是一个简单的JavaBean,存储临信息。
getActionClass(actionName)方法就是将URL上的actionName取出与struts.xml中的&action&结点匹配,可以得到Action的类全名,Action所调用的具体哪个方法名,Action的所有result结点(因为方法还没有执行,还不知道是具体哪一个result结点,所以先存起来,后面来解析)分别存在ActionClass对象中相应的属性中去。具体的解析代码我就不打出来了,否则文章太长。
再来看看setBeforeActionValue(clas, params)这一句。其实就是将得到的ActionClass对象与提交的参数全部传进去,给Action的那些set属性赋值:
* 调用Action,并执行Action的无参方法
* @param actionClass
* @param request.getParameterMap()
public Object setActionValues(ActionClass actionClass,
Map&String, String[]& params) {
// 得到Action的Class,并根据无参构造函数生成一个Action对象
Class clas = Class.forName(actionClass.getClassName());
Object obj = clas.newInstance();
if (params != null && params.size() & 0) {
Iterator&String& it = params.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
String[] value = params.get(key);
String upperFirstLetter = key.substring(0, 1).toUpperCase();
// 获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + upperFirstLetter
+ key.substring(1);
Method method =
// 看看该页面提交的参数名中,是否在Action有set方法
method = clas.getMethod(setMethodName,
new Class[] { String.class });
} catch (NoSuchMethodException e) {
System.out.println("警告 " + actionClass.getClassName()
+ "." + setMethodName + "("
+ String.class.getName() + ") 不存在");
if (method != null) {
// 如果有set方法,就调用set方法,进行赋值操作
String result = StringUtil.StringArrayToString(value);
method.invoke(obj, new String[] { result });
这样就顺利的将页面的值赋给了Action的相应属性,接下来就是Action调用工作了。通过setActionValues方法,我们已经可以得到Action对象本身了,可以存在ActionClass对象clas中去,我们直接调用setResultValue(clas, request)在Action执行后,同时也把有get方法的属性一并存于request域中:
* 调用Action,并执行Action的无参方法
* @param actionClass
* @param obj
要处理的对象
public Object invokeAction(ActionClass actionClass) {
Object obj = actionClass.getAction();
Class clas = obj.getClass();
Method method = clas.getMethod(actionClass.getMethod(), null);
String result = (String) method.invoke(obj, null);
this.setInvokeResult(result, actionClass);
actionClass.setAction(obj);
很简单的代码——调用Action那个无参执行方法,得到返回String类型的返回结果,然后我们可以再次利用ActionClass将最终的返回结果也给解析出来,看this.setInvokeResult(result, actionClass)方法
* 匹配&result name="success"&/index.jsp&/result& Xml中的result
* name属性,如果匹配成功,设置返回结果"/index.jsp"
* @param result
* @param actionClass
private void setInvokeResult(String result, ActionClass actionClass) {
List&Element& elements = actionClass.getElements();
for (Element elem : elements) {
Attribute name = XmlUtil.getAttributeByName(elem, "name");
if (StringUtil.equals(result, name.getText())) {
actionClass.setResult(elem.getText());
throw new RuntimeException("请确定在xml配置文件中是否有名叫 [" + result
+ "] 的返回类型结点 ");
一切大功告成,将刚刚得到的返回结果用servletContext.getRequestDispatcher(clas.getResult()).forward(request, response)转发出去,编码部分完毕。
别忘记了在web.xml中配置这个Filter:
&filter-name&struts&/filter-name&
&filter-class&com.framework.core.StrutsFilter&/filter-class&
&filter-mapping&
&filter-name&struts&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
最后写个测试Action吧,就按照本文最开始的那个struts.xml配置编写HelloAction.java
public class HelloAction {
public String hello() {
message = "superleo " + this.
return "success";
public String getMessage() {
public void setMessage(String message) {
this.message =
如果下载了源代码,可分别输入下列几个链接看看测试效果:(test文件夹下是单元测试)
?message=superleo
(413.6 KB)
描述: 本文的源代码。
下载次数: 1152
62 顶13 踩
浏览 13877
& 上一页 1
浏览: 550748 次
来自: 北京
java hibernate demo使用实例教程源代码下载: ...
hantsy 写道这种lazy的解释只对了一半,按java p ...
看了下时间,不是楼主是否还在开发
&最后但并不是最不重要的一点就是& BZ, ...
十分感谢,正在学习中,受益匪浅
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'struts2 BaseAction该如何写 - ITeye问答
我们在玩struts1的时候,通常都会 extends Action 然后写一个public void setServlet(ActionServlet actionServlet) {
this.managerFacade = (ManagerFacade) wac.getBean("managerFacade");}
每个action都继承这个action,省去了每个action都得setDAO的代码。
这样的功能 在struts2中该如何实现呢?
问题补充:大家回答的有点太深奥了
没看懂(文化程度有限,高中都没读过)
说struts2和spring天然 结合
是什么概念?
我用了spring,也用了hibernate
用了spring Bean工厂
我的action和daoImpl 在applicationContext.xml都有配置
是不是 我的action中可以直接拿到dao对像,而不用 在写setdao了?
比如我的loginAction,我在spring中有一个userdao
我在loginAction中是不是可以 直接使userdao中的方法,不用setdao?
如何搞?问题补充:to:上一站,火星
我的spring配置文件是这样的
&beans default-autowire="byName"&
&bean id="userDAO" class="user.DAOImpl"
&bean id="loginAction" class="com.LoginAction
我struts配置文件
&action name="loginAction class="loingAction"
我的配置文件如何改 才能类型注入,
我的action中怎么直接使dao中的方法问题补充:我的LoginAction
public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 6282753L;
private ManagerFacade managerF
private String userId;
private String userP
@SuppressWarnings("unchecked")
public String execute(){
String status = "success";
User user =
if (!"".equals(this.getUserId()) && null != this.getUserPassword()){
user = managerFacade.getUserByUserId(userId);
怎程序运行到managerFacade.getUserByUserId(userId);这句就报错。
空指针错误。
可能是哪里出的问题?问题补充:public void setManagerFacade(ManagerFacade managerFacade) {
this.managerFacade = managerF
}
写了set方法。问题补充:cats_tiger 写得4条中,只有第3条我没看懂。
我这样写的。
&bean id="loginAction" class="com.banner.actions.login.LoginAction"&
&property name="managerFacade" ref="managerFacade"&&/property&
我在struts配置中用的是beanid
可是我 用了&property name="managerFAcade" /&报告必须写ref
我不知道ref和name都应该写啥。
是都写 dao的名字吗?问题补充:感谢cats_tiger。搞定了。
没有分了,不能在发贴子问我的login不成功的问题。
只能在这里问了。
为啥有些时候 我提示登录请求,压根就没有进入到action,直接提示我,用户名或密错误呢?
public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 6282753L;
private ManagerFacade managerF
private static String userId;
private static String userP
@SuppressWarnings("unchecked")
public String execute() throws Exception{
String status = "success";
User user =
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";
addFieldError("userPassword",getText("login.error"));
status = "input";
}
我的loginAction代码在此。省略了 getter/setter.
问题补充:写完& scope="prototype"之后报告这个错误。
Attribute "scope" must be declared for element type "bean".
而且myeclipse也把scope标红了。
把session那段代码删掉,删掉发布,重起计算机,在起tomcat
也有这个问题。
问题补充:我用的是spring2.5.5
这么一问,我仔看了一下,怎我的spring.jar 里的class文件都04年的。
采纳的答案
2.0以后就支持了,看看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"&
&beans xmlns="http://www.springframework.org/schema/beans"
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"&
spring哪个版本?试试singleton="false"这个属性。
不如用最新的2.2.6吧,这是俺们以前的项目中的实例,现在的改annotation了。
&bean& scope="prototype" id="userAction" class="mon.modules.security.user.webapp.UserAction"&
&&&&&& &property name="manager" ref="userManager"&&/property&
&&&&&& &property name="uploadedFileHandler" ref="defaultUploadedFileHandler"&&/property&
&& &/bean&
引用为啥有些时候 我提示登录请求,压根就没有进入到action,直接提示我,用户名或密错误呢?
代码中看不出什么来,而且如你所说,没有进入action,我只是觉得你的session的用法比较陌生。
刚才忘了说:
struts2的action在Spring中配置,必须把scope属性设置为prototype
&bean id="myAction" class="xx.MyAction" scope="prototype"&&/bean&
name是Action中属性名字,区分大小写
ref是被注入的bean 的bean ID
例如:
public class YourDao {
public class MyAction {
private YourDao yourD
Spring XML:
&bean id="yDao" class="YourDao"&&/bean&
&bean id="myAction" class="MyAction"&&property name="yourDao" ref="yDao"/&&/bean&
Struts XML
&action name="xxxAction" class="myAction"&&/action&
呵呵,写的好累。
整合struts2和spring:
1.classpath加入struts-spring-plugin.jar
2.struts.properties中struts.objectFactory=spring
3.将Action类作为Spring的Bean,所用到的Manager和DAO都注入,初学者建议使用&property name="xx" ref="yy"/&显式注入。
4.struts.xml中acition节点的class属性指向对应的Spring的Bean ID
BaseAction放个ManagerFacade的属性,名称和Spring中ManagerFacade的bean id一致,就可以被注入了,当然,显式的&property&注入更明确一些。但是,struts action中&action class="bean id"&class必须是bean id,不能是class名称了。
managerFacade 未注入。。
需要个set方法
哦,我糊涂了,BaseAction怎样写都OK,关键是你喜欢就好。
&?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"&
&package namespace="/admin/user" name="admin-user"
extends="defaults"&
&action name="index"
class="com.hnjk.gdpolice.admin.user.actions.UserAction"&
&result name="success" type="dispatcher"&
/admin/user/index.jsp
&action name="create"
class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="create"&
&result name="success" type="redirect"&
/admin/user/index.action
&result name="input"&/admin/user/new.jsp&/result&
&action name="edit"
class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="edit"&
&result name="success" type="dispatcher"&
/admin/user/edit.jsp
&action name="update"
class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="update"&
&result name="success" type="redirect"&
/admin/user/index.action
&result name="input"&/admin/user/edit.jsp&/result&
&action name="remove"
class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="remove"&
&result name="success" type="redirect"&
/admin/user/index.action
&action name="login"
class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="login"&
&result name="success" type="redirect"&/index.jsp&/result&
&result name="input"&/index.jsp&/result&
&interceptor-ref name="defaultStack"/&
&action name="logout"
class="com.hnjk.gdpolice.admin.user.actions.UserAction" method="logout"&
&result name="success"&/index.jsp&/result&
&interceptor-ref name="defaultStack"/&
&/package&
另外,struts.properties中配置
### 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
也就是action里面加一个userDAO属性,给它一个set方法就可以注入了。
action里面加一个setUserDAO方法就行了
把action配置到你的spring中,struts.properties中objectFactory=spring
struts的action这样配置:
&action class="beanId"&
那就需要你在xml里面配置action了,也就是让spring管理里的action,注入方式可以选择按类型注入。
有了ServletContext,再拿到ApplicationContext就好办了把,用WebApplicationContextUtils...
this.managerFacade = (ManagerFacade) wac.getBean("managerFacade");
你这种用法方便是方便了点,可以不需要让spring来管理你的action,直接拿到manager,唯一的缺点就是action基本无法写单元测试。不过正常情况下如果action里面仅仅是转发,而没有业务逻辑的时候,你这种方式还是可以采纳的。
PS:我也经常这样干。
是从spring中取得bean吗?struts2和spring天然结合,需要加入struts-spring-plugin-xxx.jar
然后ObjectFactory设置为spring
也可以从ActionContext获得Request,ServletContext等对象:
protected final ActionContext getActionContext() {
return (actionContext == null) ? actionContext = ActionContext
.getContext() : actionC
* 获得当前Http Servlet Request.
* 如果在单元测试环境下,则每次调用都返回一个新的MockHttpServletRequest的实例
protected final HttpServletRequest getRequest() {
HttpServletRequest request =
if (getActionContext() != null) { // 从Struts2中取得Request
request = (HttpServletRequest) getActionContext().get(
StrutsStatics.HTTP_REQUEST);
protected final ServletContext getServletContext() {
ServletContext ctx = (ServletContext) getActionContext().get(
StrutsStatics.SERVLET_CONTEXT);
像你那么用也可以。。。
我的service都是设置好,让spring帮我自动注入action去。。
protected DepartmentService departmentS
public void setDepartmentService(DepartmentService departmentService)
{
this.departmentService = departmentS
}
当struts2使用spring来进行action的管理的时候,这个是会自动注入的
一样的用法,不需要任何变化
已解决问题
未解决问题

我要回帖

更多关于 struts2 jar包下载 的文章

 

随机推荐