- 浏览: 150554 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
hekuilove:
楼主 介意把你的代码放到//代码 里么
JPA一对多,多对多映射 -
308202251:
[size=medium][/size][align=cent ...
usionCharts中文乱码问题 -
勇敢的核桃:
我日,从传~智~播~客上听来的东西原封不动的就转了。。人才!但 ...
搭建JPA开发环境和全局事务介绍 -
w156445045:
怎么使用啊?和log4j一样 写个配置文件还是?
谢谢~
slf4j-1.6.1.zip -
JavaStudyEye:
啥也不说了 很详细,谢谢分享,太好了
Struts2 + JQuery + Json 实例
在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest、HttpSession和ServletContext。Struts 2框架让我们可以直接访问和设置action及模型对象的数据,这降低了对HttpServletRequest对象的使用需求,但在某些应用中,我们可能会需要在action中去访问HttpServletRequest对象以及其他两种对象,例如,用户登录成功后,我们应该将用户信息保存到Session中。
Struts 2提供了多种方式来访问上述的三种对象,归结起来,可以划分为两大类:与Servlet API解耦的访问方式和与Servlet API耦合的访问方式。
与Servlet API解耦的访问方式
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。
要获取这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类(参看第4章4.2节)。
ActionContext是action执行的上下文,在ActionContext中保存了action执行所需的一组对象,包括parameters、request、session、application和locale等。ActionContext类定义了如下方法,用于获取HttpServletRequest、HttpSession和ServletContext对应的Map对象。
Ø public Object get(Object key)
ActionContext类没有提供类似getRequest()这样的方法来获取封装了HttpServletRequest的Map对象。要得到请求Map对象,你需要为get()方法传递参数“request”。
Ø public Map getSession()
获取封装了HttpSession的Map对象。
Ø public Map getApplication()
获取封装了ServletContext的Map对象。
我们看例3-11。
例3-11 通过ActionContext来获取request、session和application对象的LoginAction1
package org.sunxin.struts2.ch03.action.way1;
import java.util.Map;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction1 implements Action
{
private User user;
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
@SuppressWarnings("unchecked")
@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
ActionContext context = ActionContext.getContext();
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();
//在请求中放置欢迎信息。
request.put("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.put("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)application.get("counter");
if(null == count)
count=1;
else
count++;
application.put("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
}
在成功页面中,可以使用JSP内置的表达式语言来访问request、session和application范围的数据,代码如例3-12所示。
例3-12 success.jsp
<%@ page contentType="text/html;charset=GBK" %>
<html>
<head><title>欢迎页面</title></head>
<body>
<h3>${sessionScope.user.username},${requestScope.greeting}。<br>
本站的访问量是:${applicationScope.counter}</h3>
</body>
</html>
如果页面能够正常显示我们保存在request、session和application对象中的数据(当然是能够正常显示的,要不然笔者也不会给出这个例子了。☺),就说明在Action中,对ActionContext返回的Map对象的操作,等价于对Servlet API中的HttpServletRequest、HttpSession和ServletContext对象的操作。
利用请求对象来传递数据还有一种方式,你可以直接使用ActionContex类的put()方法将数据保存到ActionContext中,如下:
ActionContext.getContext().put("greeting", "欢迎您来到http://www. sunxin.org");
然后在结果页面中,从请求对象中取出greeting属性,如下:
${requestScope.greeting} 或者 <%=request.getAttribute("greeting")%>
ActionContext中保存的数据能够从请求对象中得到,这让人太不可思议了。其中的奥妙就在于Struts 2中的org.apache.struts2.dispatcher.StrutsRequestWrapper类,这个类是HttpServletRequest的包装类,它重写了getAttribute()方法(在页面中获取request对象的属性就要调用这个方法),在这个方法中,它首先在请求对象中查找属性,如果没有找到(如果你在ActionContext中保存数据,当然就找不到了),则到ActionContext中去查找。这就是为什么在ActionContext中保存的数据能够从请求对象中得到的原因。
当然具体的实现还有很多细节,感兴趣的读者可以跟踪一下Struts 2的源代码。
除了利用ActionContext来获取request、session和application对象这种方式外,Action类还可以实现某些特定的接口,让Struts 2框架在运行时向Action实例注入request、session和application对象。与之对应的三个接口和它们的方法如下所示:
Ø org.apache.struts2.interceptor.RequestAware
框架利用该接口,向Action实例注入request Map对象。该接口只有一个方法,如下:
— public void setRequest(Map request)
Ø org.apache.struts2.interceptor.SessionAware
框架利用该接口,向Action实例注入session Map对象。该接口只有一个方法,如下:
— void setSession(Map session)
Ø org.apache.struts2.interceptor.ApplicationAware
框架利用该接口,向Action实例注入application Map对象。该接口只有一个方法,如下:
— void setApplication(Map application)
我们看例3-13。
例3-13 通过接口注入来获取request、session和application对象的LoginAction2
package org.sunxin.struts2.ch03.action.way1;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
public class LoginAction2 implements Action, RequestAware, SessionAware, ApplicationAware
{
private Map request;
private Map session;
private Map application;
…
@SuppressWarnings("unchecked")
@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
//在请求中放置欢迎信息。
request.put("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.put("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)application.get("counter");
if(null == count)
count=1;
else
count++;
application.put("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
@Override
public void setRequest(Map request)
{
this.request = request;
}
@Override
public void setSession(Map session)
{
this.session = session;
}
@Override
public void setApplication(Map application)
{
this.application = application;
}
}
LoginAction2类实现了RequestAware、SessionAware和ApplicationAware接口,框架在运行时会调用这三个接口中的方法,向LoginAction2注入request、session和application对象。在execute()方法中不再需要访问ActionContext,因此我们删除了与之相关的代码。
虽然利用Struts 2提供的request、session和application对象就可以对HttpServletRequest、HttpSession和ServletContext对象中的数据进行操作,但它们毕竟是Map类型,如果我们需要调用HttpServletRequest、HttpSession和ServletContext中的特定操作,例如获取请求方法的名字(调用HttpServletRequest中的getMethod()方法),那么可以使用下一节介绍的方式来获取Servlet环境中的对象。
与Servlet API耦合的访问方式
直接访问Servlet API将使你的Action与Servlet环境耦合在一起,我们知道对于HttpServletRequest、HttpServletResponse和ServletContext这些对象,它们都是由Servlet容器来构造的,与这些对象绑定在一起,测试时就需要有Servlet容器,不便于Action的单元测试。但有时候,我们又确实需要直接访问这些对象,那么当然是以完成任务需求为主。
要直接获取HttpServletRequest和ServletContext对象,可以使用org.apache.struts2. ServletActionContext类,该类是ActionContext的子类,在这个类中定义下面两个静态方法:
Ø public static HttpServletRequest getRequest()
得到HttpServletRequest对象。
Ø public static ServletContext getServletContext()
得到ServletContext对象。
此外,ServletActionContext类还给出了获取HttpServletResponse对象的方法,如下:
Ø public static HttpServletResponse getResponse()
ServletActionContext类并没有给出直接得到HttpSession对象的方法,HttpSession对象可以通过HttpServletRequest对象来得到。
除了上述的方法调用得到HttpServletRequest和ServletContext对象外,还可以调用ActionContext对象的get()方法,传递ServletActionContext.HTTP_REQUEST和ServletActionContext.SERVLET_CONTEXT键值来得到HttpServletRequest和ServletContext对象,如下所示:
Ø ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
得到与ServletActionContext.HTTP_REQUEST键值绑定的HttpServletRequest对象。
Ø ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);
得到与ServletActionContext.SERVLET_CONTEXT键值绑定的ServletContext对象。
同样的,也可以向ActionContext的get()方法传递ServletActionContext.HTTP_ RESPONSE键值来得到HttpServletResponse对象,如下:
Ø ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);
建议读者采用第一种方式来获取HttpServletRequest和ServletContext对象,这样简单而又清晰。
我们看例3-14。
例3-14 通过ServletActionContext来获取HttpServletRequest和ServletContext对象的LoginAction3
package org.sunxin.struts2.ch03.action.way2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
public class LoginAction3 implements Action
{
...
@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();
/*ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(Servlet ActionContext.HTTP_REQUEST);
HttpSession session = request.getSession();
ServletContext context = (ServletContext)ctx.get(ServletAction Context. SERVLET_CONTEXT);*/
//在请求中放置欢迎信息。
request.setAttribute("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.setAttribute("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)context.getAttribute("counter");
if(null == count)
count=1;
else
count++;
context.setAttribute("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
}
除了利用ServletActionContext来获取HttpServletRequest对象和ServletContext对象这种方式外,Action类还可以实现ServletRequestAware和ServletContextAware接口,由Struts 2框架向Action实例注入HttpServletRequest和ServletContext对象。
org.apache.struts2.interceptor.ServletRequestAware接口只有一个方法,如下所示:
Ø void setServletRequest(HttpServletRequest request)
org.apache.struts2.util.ServletContextAware接口也只有一个方法,如下所示:
Ø void setServletContext(ServletContext context)
ServletRequestAware接口和ServletContextAware接口不属于同一个包,前者在org.apache.struts2.interceptor包中,后者在org.apache.struts2.util包中,这很让人迷惑。
我们看例3-15。
例3-15 通过接口注入来获取HttpServletRequest和ServletContext对象的LoginAction4
package org.sunxin.struts2.ch03.action.way2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
public class LoginAction4 implements Action, ServletRequestAware, ServletContextAware
{
private HttpServletRequest request;
private ServletContext context;
…
@Override
public String execute() throws Exception
{
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
HttpSession session = request.getSession();
//在请求中放置欢迎信息。
request.setAttribute("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.setAttribute("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer) context.getAttribute("counter");
if (null == count)
count = 1;
else
count++;
context.setAttribute("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
@Override
public void setServletRequest(HttpServletRequest request)
{
this.request = request;
}
@Override
public void setServletContext(ServletContext context)
{
this.context = context;
}
}
LoginAction4类实现了ServletRequestAware和ServletContextAware接口,框架在运行时会调用这两个接口中的方法,向LoginAction4注入HttpServletRequest和ServletContext对象。在execute()方法中不再需要访问ServletActionContext,因此我们删除了与之相关的代码。
Struts 2提供了多种方式来访问上述的三种对象,归结起来,可以划分为两大类:与Servlet API解耦的访问方式和与Servlet API耦合的访问方式。
与Servlet API解耦的访问方式
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。
要获取这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类(参看第4章4.2节)。
ActionContext是action执行的上下文,在ActionContext中保存了action执行所需的一组对象,包括parameters、request、session、application和locale等。ActionContext类定义了如下方法,用于获取HttpServletRequest、HttpSession和ServletContext对应的Map对象。
Ø public Object get(Object key)
ActionContext类没有提供类似getRequest()这样的方法来获取封装了HttpServletRequest的Map对象。要得到请求Map对象,你需要为get()方法传递参数“request”。
Ø public Map getSession()
获取封装了HttpSession的Map对象。
Ø public Map getApplication()
获取封装了ServletContext的Map对象。
我们看例3-11。
例3-11 通过ActionContext来获取request、session和application对象的LoginAction1
package org.sunxin.struts2.ch03.action.way1;
import java.util.Map;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction1 implements Action
{
private User user;
public User getUser()
{
return user;
}
public void setUser(User user)
{
this.user = user;
}
@SuppressWarnings("unchecked")
@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
ActionContext context = ActionContext.getContext();
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();
//在请求中放置欢迎信息。
request.put("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.put("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)application.get("counter");
if(null == count)
count=1;
else
count++;
application.put("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
}
在成功页面中,可以使用JSP内置的表达式语言来访问request、session和application范围的数据,代码如例3-12所示。
例3-12 success.jsp
<%@ page contentType="text/html;charset=GBK" %>
<html>
<head><title>欢迎页面</title></head>
<body>
<h3>${sessionScope.user.username},${requestScope.greeting}。<br>
本站的访问量是:${applicationScope.counter}</h3>
</body>
</html>
如果页面能够正常显示我们保存在request、session和application对象中的数据(当然是能够正常显示的,要不然笔者也不会给出这个例子了。☺),就说明在Action中,对ActionContext返回的Map对象的操作,等价于对Servlet API中的HttpServletRequest、HttpSession和ServletContext对象的操作。
利用请求对象来传递数据还有一种方式,你可以直接使用ActionContex类的put()方法将数据保存到ActionContext中,如下:
ActionContext.getContext().put("greeting", "欢迎您来到http://www. sunxin.org");
然后在结果页面中,从请求对象中取出greeting属性,如下:
${requestScope.greeting} 或者 <%=request.getAttribute("greeting")%>
ActionContext中保存的数据能够从请求对象中得到,这让人太不可思议了。其中的奥妙就在于Struts 2中的org.apache.struts2.dispatcher.StrutsRequestWrapper类,这个类是HttpServletRequest的包装类,它重写了getAttribute()方法(在页面中获取request对象的属性就要调用这个方法),在这个方法中,它首先在请求对象中查找属性,如果没有找到(如果你在ActionContext中保存数据,当然就找不到了),则到ActionContext中去查找。这就是为什么在ActionContext中保存的数据能够从请求对象中得到的原因。
当然具体的实现还有很多细节,感兴趣的读者可以跟踪一下Struts 2的源代码。
除了利用ActionContext来获取request、session和application对象这种方式外,Action类还可以实现某些特定的接口,让Struts 2框架在运行时向Action实例注入request、session和application对象。与之对应的三个接口和它们的方法如下所示:
Ø org.apache.struts2.interceptor.RequestAware
框架利用该接口,向Action实例注入request Map对象。该接口只有一个方法,如下:
— public void setRequest(Map request)
Ø org.apache.struts2.interceptor.SessionAware
框架利用该接口,向Action实例注入session Map对象。该接口只有一个方法,如下:
— void setSession(Map session)
Ø org.apache.struts2.interceptor.ApplicationAware
框架利用该接口,向Action实例注入application Map对象。该接口只有一个方法,如下:
— void setApplication(Map application)
我们看例3-13。
例3-13 通过接口注入来获取request、session和application对象的LoginAction2
package org.sunxin.struts2.ch03.action.way1;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
public class LoginAction2 implements Action, RequestAware, SessionAware, ApplicationAware
{
private Map request;
private Map session;
private Map application;
…
@SuppressWarnings("unchecked")
@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
//在请求中放置欢迎信息。
request.put("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.put("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)application.get("counter");
if(null == count)
count=1;
else
count++;
application.put("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
@Override
public void setRequest(Map request)
{
this.request = request;
}
@Override
public void setSession(Map session)
{
this.session = session;
}
@Override
public void setApplication(Map application)
{
this.application = application;
}
}
LoginAction2类实现了RequestAware、SessionAware和ApplicationAware接口,框架在运行时会调用这三个接口中的方法,向LoginAction2注入request、session和application对象。在execute()方法中不再需要访问ActionContext,因此我们删除了与之相关的代码。
虽然利用Struts 2提供的request、session和application对象就可以对HttpServletRequest、HttpSession和ServletContext对象中的数据进行操作,但它们毕竟是Map类型,如果我们需要调用HttpServletRequest、HttpSession和ServletContext中的特定操作,例如获取请求方法的名字(调用HttpServletRequest中的getMethod()方法),那么可以使用下一节介绍的方式来获取Servlet环境中的对象。
与Servlet API耦合的访问方式
直接访问Servlet API将使你的Action与Servlet环境耦合在一起,我们知道对于HttpServletRequest、HttpServletResponse和ServletContext这些对象,它们都是由Servlet容器来构造的,与这些对象绑定在一起,测试时就需要有Servlet容器,不便于Action的单元测试。但有时候,我们又确实需要直接访问这些对象,那么当然是以完成任务需求为主。
要直接获取HttpServletRequest和ServletContext对象,可以使用org.apache.struts2. ServletActionContext类,该类是ActionContext的子类,在这个类中定义下面两个静态方法:
Ø public static HttpServletRequest getRequest()
得到HttpServletRequest对象。
Ø public static ServletContext getServletContext()
得到ServletContext对象。
此外,ServletActionContext类还给出了获取HttpServletResponse对象的方法,如下:
Ø public static HttpServletResponse getResponse()
ServletActionContext类并没有给出直接得到HttpSession对象的方法,HttpSession对象可以通过HttpServletRequest对象来得到。
除了上述的方法调用得到HttpServletRequest和ServletContext对象外,还可以调用ActionContext对象的get()方法,传递ServletActionContext.HTTP_REQUEST和ServletActionContext.SERVLET_CONTEXT键值来得到HttpServletRequest和ServletContext对象,如下所示:
Ø ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
得到与ServletActionContext.HTTP_REQUEST键值绑定的HttpServletRequest对象。
Ø ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);
得到与ServletActionContext.SERVLET_CONTEXT键值绑定的ServletContext对象。
同样的,也可以向ActionContext的get()方法传递ServletActionContext.HTTP_ RESPONSE键值来得到HttpServletResponse对象,如下:
Ø ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);
建议读者采用第一种方式来获取HttpServletRequest和ServletContext对象,这样简单而又清晰。
我们看例3-14。
例3-14 通过ServletActionContext来获取HttpServletRequest和ServletContext对象的LoginAction3
package org.sunxin.struts2.ch03.action.way2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
public class LoginAction3 implements Action
{
...
@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();
/*ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(Servlet ActionContext.HTTP_REQUEST);
HttpSession session = request.getSession();
ServletContext context = (ServletContext)ctx.get(ServletAction Context. SERVLET_CONTEXT);*/
//在请求中放置欢迎信息。
request.setAttribute("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.setAttribute("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)context.getAttribute("counter");
if(null == count)
count=1;
else
count++;
context.setAttribute("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
}
除了利用ServletActionContext来获取HttpServletRequest对象和ServletContext对象这种方式外,Action类还可以实现ServletRequestAware和ServletContextAware接口,由Struts 2框架向Action实例注入HttpServletRequest和ServletContext对象。
org.apache.struts2.interceptor.ServletRequestAware接口只有一个方法,如下所示:
Ø void setServletRequest(HttpServletRequest request)
org.apache.struts2.util.ServletContextAware接口也只有一个方法,如下所示:
Ø void setServletContext(ServletContext context)
ServletRequestAware接口和ServletContextAware接口不属于同一个包,前者在org.apache.struts2.interceptor包中,后者在org.apache.struts2.util包中,这很让人迷惑。
我们看例3-15。
例3-15 通过接口注入来获取HttpServletRequest和ServletContext对象的LoginAction4
package org.sunxin.struts2.ch03.action.way2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import org.sunxin.struts2.ch03.model.User;
import com.opensymphony.xwork2.Action;
public class LoginAction4 implements Action, ServletRequestAware, ServletContextAware
{
private HttpServletRequest request;
private ServletContext context;
…
@Override
public String execute() throws Exception
{
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.
getPassword()))
{
HttpSession session = request.getSession();
//在请求中放置欢迎信息。
request.setAttribute("greeting", "欢迎您来到程序员之家");
//在session中保存user对象
session.setAttribute("user", user);
//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer) context.getAttribute("counter");
if (null == count)
count = 1;
else
count++;
context.setAttribute("counter", count);
return SUCCESS;
}
else
{
return ERROR;
}
}
@Override
public void setServletRequest(HttpServletRequest request)
{
this.request = request;
}
@Override
public void setServletContext(ServletContext context)
{
this.context = context;
}
}
LoginAction4类实现了ServletRequestAware和ServletContextAware接口,框架在运行时会调用这两个接口中的方法,向LoginAction4注入HttpServletRequest和ServletContext对象。在execute()方法中不再需要访问ServletActionContext,因此我们删除了与之相关的代码。
发表评论
-
appfuse 安装笔记
2011-06-11 21:27 2011环境是maven 2.2.1 我 ... -
java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor
2011-05-11 22:35 1426org.apache.jasper.JasperExcepti ... -
ValueStack
2011-04-28 09:33 4105在struts2中没有与servlet ... -
java中HashSet详解
2011-04-27 23:54 888HashSet 的实现 对于 HashSet 而言,它是基于 ... -
valuestack的工作原理(转)
2011-04-27 17:12 1220当访问一个action的时候,此时struts2会把整个act ... -
Struts 2杂谈(1):ValueStack对象的传送带机制
2011-04-27 10:57 825众所周知,Strut 2的Act ... -
跟我一步一步学struts2
2011-04-15 10:25 946一.Struts2概述 众所周 ... -
Struts in Action读书笔记
2011-04-12 22:59 2295转自 http://blog.csdn.net/Jiangc ... -
struts2中请求action错误与jsp请求错误处理
2011-02-18 16:05 1749在struts2中,若请求的XXX.action不存 ... -
在MyEclipse中安装Freemarker插件
2011-01-13 10:43 1174<转>在MyEclipse中安装Freemarke ... -
Struts2提交数组
2011-01-10 18:17 4685webwork表单提交中有一个很有用的技巧,在提交成组的类似p ... -
Struts2 类型转换 Type Convertion (转载)
2011-01-10 18:01 998HTTP协议中传递的任何内 ... -
struts2 xml 验证出现 Invalid field value for field 的解决方法(转)
2011-01-10 13:07 1383缺省情况下, 所有的装换错误使用通用的i18n信息 xwork ... -
Struts2 类型转换 Type Convertion (转载)
2011-01-10 10:02 814为什么会有类型转换? HTTP协议中传递的任何内容都是Stri ... -
Struts2使用拦截器完成权限控制示例
2011-01-06 23:01 1020示例需求: 要求用户登录,且必须为指定用户名才可以查看系 ... -
关于tomcat6.0 连接池 和myeclipse内置tomcat连接池的建立
2010-12-28 16:43 18691 下载Tomcat最新版本 下载地址:http://tomc ... -
java Struts2使用拦截器完成权限控制示例
2010-12-24 18:09 965Struts2使用拦截器完成权限控制示例 关键字: strut ... -
struts2 权限控制拦截器
2010-12-24 17:56 11531 实现权限控制拦截器 ... -
struts2 标签使用异常 The Struts dispatcher cannot be found.
2010-12-17 13:52 1335struts2 标签使用异常 The Struts disp ... -
调式struts时候遇到的问题总结
2010-12-17 13:52 10572010-12-17 14:04:23 com.opensym ...
相关推荐
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
用deepseek变现实操流程,小白必看。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!