struts2 action标签的action实现接口时报错

struts2 的 Action 实现了ServletRequestAware接口,但是获取不到HttpServletRequest对象实例
采纳的答案
需要在struts.xml配置文件中对相应的action加上拦截器引用:&interceptor-ref name="servletConfig"&&/interceptor-ref&
引用struts2 的 Action 实现了ServletRequestAware接口,但是获取不到HttpServletRequest对象实例
要实现接口方法:
private ServletC
public void setServletContext(ServletContext context) {
this.context =
另外确保你的interceptorStack中含有
&interceptor-ref name="servletConfig"/&
最后,是不是InterceptorStack中的在servletConfig前面的Interceptor,已经做出了转向,即直接返回了result,后续Interceptor不再被调用
已解决问题
未解决问题Struts2弹出信息提示窗口相关文章推荐 - 24小时学习网
欢迎您来到24小时学习网!!!
相关文章推荐:Struts2弹出信息提示窗口
发布日期: 点击:(9)
第一种:在struts2 action中弹出Js脚本提示信息让action实现ServletResponseAware接口,同时实现其setServletResponse()方法import org.apache.struts2.interceptor.ServletResponseApublic class StudentAction extends ActionSupport implements ServletResponseAware{private javax.servlet.http.HttpServletRpublic String addStudent() throws IOException{response.setContentType("text/charset=UTF-8");response.setCharacterEncoding("UTF-8")
无论是开发WEB应用还是信息系统,总要遇到需要登录的问题。即使是开放度很高的网站,也需要有这个功能,除非是一些完全静态的网站,没有一点交互的内容。这个是学习笔记,直奔主题。LoginAction类是已经写好了,要记录用户登录的信息,只需要在return SUCCESS;前面加上以下这段代码就OK了。Map&String, String& attibutes = ActionContext.getContext().getSession();//记录用户登录信息attibutes.put("username", username);attibutes.
发布日期: 点击:(2092)
package 元素的所有属性及对应功能:AttributeRequiredDescriptionnameyeskey to for other packages toreference ---包名称,用来让别的包继承时使用不能有重复extendsnoinherits package behavior ofthe package it extends-----当前包所要继承的父包,继承之后,当前包拥有父包中所定义的任意类、拦截器等namespaceno用于区分包中相同的类abstractnodeclares package to be abstract(
发布日期: 点击:(1427)
HTTP Status 500 -type Exception reportmessagedescription The server encountered an internal error () that prevented it from fulfilling this request.exceptionjava.lang.reflect.InvocationTargetExceptionsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.
发布日期: 点击:(749)
首先确保struts2-spring-plugin-x-x-x.jar在应用程序的构建路径中。其次,在struts.xml或者struts.properties中设置struts.objectFactory属性为org.apache.struts2.spring.StrutsSpringObjectFactory。第三、设置自动装配属性(可选)struts.objectFactory.spring.autoWire=type,这里要说明一下,之所以说这一步是可选的是因为struts2有自己的默认值。下面是这一属性几个可选项的说明:name(默认):按名称装配,
发布日期: 点击:(606)
1、思想的大致模型2、建立数据库test和数据库表tb_user1 CREATE DATABASE `test`;2 ?CREATE TABLE `test`.`tb_user` (3 `username` varchar(20) NOT NULL,4 `password` varchar(20) NOT NULL,5 PRIMARY KEY (`username`)6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;3、加入基本的struts包3.1、加入struts2的基本包commons-fileupload-1.2.1.jarcommons-io-1.
发布日期: 点击:(2179)
1:所有拦截器的超级接口Interceptor ,Action去实现这个接口;?Interceptor它其中有三个方法(init(),destroy(),interceptor()):?????Init()方法:在服务器起动的时候加载一次,并且只加载一次;?????Destroy()方法:当拦截器销毁时执行的方法;?????Interceptor()方法:其中里边有一个参数invocationpublic Stringintercept(ActionInvocation invocation) throws xception{??????System.out.
发布日期: 点击:(859)
今天做了一个Struts2和Spring整合的练习,中间出了一点问题,贴出来供其它人参考。代码写好后启动Tomcat服务器时报错:严重: Exception starting filter struts2java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerIm
发布日期: 点击:(1842)
一.需要包(两个),我用的是struts-2.1.8.1,注意版本??? struts2-sitemesh-plugin-2.1.8.1.jar??? sitemesh-2.4.2.jar二.创建decorators.xml&?xml version="1.0" encoding="utf-8"?&&decorators defaultdir="/decorators"&&!--excludes结点则指定了哪些路径的请求不使用任何模板--&&!--/index.jsp和凡是以/login/开头的请求路径一律不使用
发布日期: 点击:(937)
struts2已经集成了jsp标准的 JSTL标签用法,比如: Action里面定义的变量private int sellerU,除了&s:property&标签外,还可以使用如下jstl来输出到页面上: ${sellerUin}struts2会自动对http请求参数做类型转换。请求参数sellerUin=123会正常处理,而请求参数sellerUin=abc则会抛出参数转换错误,返回到"input"这个result上。但是,在2.0.9这个版本的struts2中, 传参数sellerUin=abc,只要不是通过&s:proper
发布日期: 点击:(672)
第一节 需求定义简单的需求如下图1 用户处在Welcome.jsp 页面,点击登录连接到达Login.jsp页面2 在Login.jsp输入用户名密码,点击登陆按钮,转到LoginAction处理3.1 在登陆成功的情况下,再回到Welcome.jsp页面,在页面上显示登录信息3.2 在登陆失败的情况下,返回到Login.jsp显示登陆错误信息Welcome.jspLogin.jsp1 开始登陆2 登陆3.1登陆成功3.2登陆失败LoginAction第二节 使用maven建立基本开发结构使用如下命令建立Struts2 应用程序框架结构mvn arche
发布日期: 点击:(620)1、对于一些功能,如我的调查或新建调查等,只有用户登录后才能进行操作,因此必须对用户是否登录进行判断。当用户登录后才能使用相应的功能,如果没有登录则需为用户导航到登录页面让其进行登录。这个功能可以通过自定义Struts2的拦截器来完成。2、当用户登录之后,由于是将用户的信息保存在session中的。这样当一些Action中需要用到当前登录的用户的信息时需要手动的从session中获取,不太方便,因此我们声明了一个UserAware接口(即用户关注,类似于Struts2中的SessionAware等),当Action实现了该接口后,我们可以自动的为Action注入用户对象。3、UserAware接口定义如下,在其中声明了一个setUser()方法:1 package com.atguigu.surveypark.struts2;2 import com.atguigu.surveypark.model.U3 /**4
* 用户关注5*/6 public interface UserAware {7 public void setUser(User user);8 }4、定义SurveyAction并让其实现UserAware接口: 1 package com.atguigu.surveypark.struts2. 2 import java.util.L 3 import javax.annotation.R 4 import org.springframework.context.annotation.S 5 import org.springframework.stereotype.C 6 import com.atguigu.surveypark.model.S 7 import com.atguigu.surveypark.model.U 8 import com.atguigu.surveypark.service.SurveyS 9 import com.atguigu.surveypark.struts2.UserA10 /**11
* SurveyAction12*/13 @Controller14 @Scope(&prototype&)15 public class SurveyAction extends BaseAction&Survey& implements UserAware{16 @Resource//注入SurveyService17 private SurveyService surveyS18 //调查集合19 private List&Survey& myS20 //接受user对象21 private User user;22 //接受sid参数23 private I24 public Integer getSid() {25 return26 }27 public void setSid(Integer sid) {28 this.sid =29 }30 public List&Survey& getMySurveys() {31 return myS32 }33 public void setMySurveys(List&Survey& mySurveys) {34 this.mySurveys = myS35 }36 //查询我的调查列表37 public String mySurveys(){38 this.mySurveys = surveyService.findMySurveys(user);39 return &mySurveyListPage& ;40 }41 42 //新建调查43 public String newSurvey(){44 this.model = surveyService.newSurvey(user);45 return &designSurveyPage& ;46 }47 48 //设计调查49 public String designSurvey(){50 this.model = surveyService.getSurveyWithChildren(sid);51 return &designSurveyPage& ;52 }53 54 //该方法只在designSurvey之前调用55 //public void prepareDesignSurvey(){56 //this.model = surveyService.getSurveyWithChildren(sid);57 //}58 //注入User对象59 public void setUser(User user) {60 this.user =61 }62 }在SurveyAction中实现了UserAware接口,并声明了一个user对象来接收注入的user对象。接下来就可以通过登录拦截器来为实现了UserAware接口的Action注入当前登录用户。5、登录拦截器实现如下: 1 package com.atguigu.surveypark.struts2. 2 import com.atguigu.surveypark.model.U 3 import com.atguigu.surveypark.struts2.UserA 4 import com.atguigu.surveypark.struts2.action.BaseA 5 import com.atguigu.surveypark.struts2.action.LoginA 6 import com.atguigu.surveypark.struts2.action.RegA 7 import com.opensymphony.xwork2.ActionI 8 import com.opensymphony.xwork2.interceptor.I 9 /**10
* 登陆拦截器11*/12 public class LoginInterceptor implements Interceptor {13 public void destroy() {}14 public void init() {}15 public String intercept(ActionInvocation arg0) throws Exception {16 BaseAction action = (BaseAction) arg0.getAction();17 if(action instanceof LoginAction18 || action instanceof RegAction){ //判断Action是否为LoginAction或RegAction,即用户是否是去登录或注册,如果是的话则放行,否则判断用户是否登录了19 return arg0.invoke();20 }else{21 User user = (User) arg0.getInvocationContext().getSession().get(&user&);22 if(user == null){//判断用户是否登录了,未登录则跳转到登录页面23 //去登陆24 return &login& ;25 }else{26 //放行27 if(action instanceof UserAware){ //判断action是否实现了UserAware接口,如果实现了则通过setUser()方法为其注入当前登录用户对象28 //注入user给action29 ((UserAware)action).setUser(user);30 }31 return arg0.invoke();32 }33 }34 }35 }可以看到,在登录拦截器中我们通过判断Action是否实现了UserAware接口可以自动的为Action注入user对象。如果在程序中不使用UserAware接口,则需要让Action实现SessionAware接口或通过ActionContext等方法获取到session,然后再从session中得到登录用户的信息。6、另外,我们还注意到,在SurveyAction的实现中,在新建调查和设计调查的方法中我们都直接使用this.model=XXX将获取到的新对象直接赋值给model对象了。我们知道,在一般情况下,Struts2的执行流程是通过在ActionProxy[DefaultActionProxy]的prepare()方法中调用ActionInvocation[DefaultActionInvocation]的init()方法完成Action的实例化工作并将其压入到值栈ValueStack的栈顶,如果Action实现了ModelDriven接口,则在执行到ModelDriven拦截器的时候,该拦截器会通过Action的getModel()方法获得到model对象,并将其压入到值栈的栈顶,之后在执行params拦截器时,会完成为model的赋值工作。因此,如果在执行Action的业务方法时,如果直接使用this.model=XXX为model重新赋值的话,会改变Action中model的引用,其与值栈栈顶的model将不再是同一个对象,因此在页面将无法正确的显示对象的内容。这里我们之所以可以这样做是因为我们对拦截器做了新的配置。相关内容总结如下:Struts2的action中为model赋值的问题总结-四种处理方法:1)手动压栈。ActionContext.getContext().getValueStack().push(newModel);缺点:Ⅰ. 耦合度高.(指Struts2的代码与自己的代码)Ⅱ. 不推荐直接操作值栈vsⅢ. 栈中的模型对象过多2)通过手动将新模型的属性全部赋值给旧模型。oldModel.setXxxx(newModel.getXxxx());...缺点:性能比较差3)使用paramsPrepareParamsStack + preparable拦截器配合使用。prepare拦截器先执行,先为model赋值,后调用modelDriven,在栈顶压入的model是新模型,但是需要主要在prepare拦截器还要进行传递参数,defaultstack在prepare不能完成传参,因此可以改换成paramsPrepareParamsStack来达到此目的。下面是paramsPrepareParamsStack(即参数预处理参数拦截器栈)的相关配置:&!-- 配置使用 paramsPrepareParamsStack 作为默认的拦截器栈 --&&!-- 修改 PrepareInterceptor 拦截器的 alwaysInvokePrepare 属性值为 false(注:这是为了在调用prepare拦截器时,使Preparable接口的prepare方法不被调用,可根据情况选择是否配置该参数) --&&interceptors& &!-- 注册登陆拦截器 --& &interceptor name=&loginInterceptor& class=&com.atguigu.surveypark.struts2.interceptor.LoginInterceptor& /& &!-- 定义拦截器栈 --& &interceptor-stack name=&surveyparkStack&&
&interceptor-ref name=&loginInterceptor& /&
&interceptor-ref name=&paramsPrepareParamsStack&&
&param name=&prepare.alwaysInvokePrepare&&false&/param&
&/interceptor-ref& &/interceptor-stack&&/interceptors&&!-- 定义默认栈 --&&default-interceptor-ref name=&surveyparkStack& /&当使用了paramsPrepareParamsStack拦截器栈,并且Action实现了Preparable接口时,可以定义以prepare或prepareDo开头加上action方法的名称的方法,这样,在执行prepare拦截器时,就会完成model赋值等预处理工作,之后执行modelDriven拦截器时将以完成赋值的model压入值栈栈顶,之后可以正确的在页面进行显示。例如在SurveyAction中的prepareDesignSurvey()方法就是在designSurvey()之前调用,完成为model赋值的工作。缺点:会导致方法的膨胀,由于很多方法中都会为model赋值,因此几乎导致了方法的翻倍。4)使用刷新机制进行赋值:直接在action中为model赋值,使用刷新机制即可★★★★★。&interceptors& &!-- 注册登陆拦截器 --& &interceptor name=&loginInterceptor& class=&com.atguigu.surveypark.struts2.interceptor.LoginInterceptor& /& &!-- 定义拦截器栈 --&&interceptor-stack name=&surveyparkStack&&
&interceptor-ref name=&loginInterceptor& /&
&interceptor-ref name=&defaultStack&&
&param name=&modelDriven.refreshModelBeforeResult&&true&/param&
&/interceptor-ref& &/interceptor-stack&&/interceptors&  这种方法依然是使用默认的拦截器栈defaultStack,只是将modelDriven拦截器的属性refreshModelBeforeResult设置为了true。这样modelDriven拦截器会添加一个监听器PreResultListener(即结果处理之前执行的监听器)到invocation中,之后在invocation调用结果处理方法之前会执行该监听器来判断是否model是否改变,是否需要刷新。该监听器的处理过程实际上就是将旧的model从栈顶移除,然后将新的model压入栈顶。7、在SurveyAction中可以看到,其设计调查的方法中使用了“surveyService.getSurveyWithChildren(sid)”,之所以使用getSurveyWithChildren()是因为存在懒加载的问题。下面总结了关于Hibernate懒加载问题的常见处理方法:1)不用懒加载:关闭Hibernate的懒加载缺点:Hibernate提供懒加载机制是为了提高程序的性能的,完全关闭后会降低程序性能。2)一劳永逸解决懒加载问题.使用spring的openSessionInViewFilter.&!-- openSessionInViewFilter,该过滤器在view(视图)渲染时始终开启session,一劳永逸解决hibernate的懒加载问题,该过滤器必须配置在struts2过滤器之前,不推荐使用(性能问题) --&&filter& &filter-name&openSessionInViewFilter&/filter-name& &filter-class&org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&/filter-class&&/filter&&filter-mapping& &filter-name&openSessionInViewFilter&/filter-name& &url-pattern&/*&/url-pattern&&/filter-mapping&  缺点:由于该过滤器在view(视图)渲染时始终开启session,也就是该过程中始终保持数据库的连接,由于数据库连接是比较宝贵的资源,因此在高并发时会导致严重的性能问题,因此不推荐使用该方法。另一方面,其可能会导致一些莫名的问题,如事务的传播行为方面的问题等。3)强行在service层面是初始化代理对象. 1 /** 2
* 按照id查询Survey,同时携带所有的孩子 3*/ 4 public Survey getSurveyWithChildren(Integer sid){ 5 //Survey s = surveyDao.getEntity(sid); 6 //降低耦合度,这里之所以使用第7行的代码而不使用第5行的代码,是其体现了高内聚(组件/类的内部),低耦合(组件/类之间)的特点 7 Survey s = this.getSurvey(sid); 8 //强行初始化pages和questions集合 9 for(Page p : s.getPages()){10 p.getQuestions().size();11 }12 return 13 }  由于Hibernate的懒加载返回的是一个代理对象,因此我们需要手动调用懒加载的集合或对象的相关方法强行将其初始化。(注:必须是调用除了getId()和getClass()方法以外的方法,否则不能被初始化)
无相关信息1.要获取集合list的Action类
public class RoleAction extends ActionSupport {
public RoleService roleS
public static ActionContext ac =
public String getMessage() {
@Resource(name = "roleService")
public void setRoleService(RoleService roleService) {
this.roleService = roleS
public List getList() {
public Role getRole() {
public void setRole(Role role) {
this.role =
public String List() throws Exception {
* 浏览权限
if (this.isRole()) {
this.list = this.roleService.get();
System.out.println(this.getList());
return "list";
return ERROR;
2.struts.xml配置action
&action name="nuserAction_*" class="nuserAction" method="{1}"&
&interceptor-ref name="nuserInterceptorStack"&&/interceptor-ref&
&result name="list"&/user/ListUser.jsp&/result&
&result name="loginSuccess"&main.jsp&/result&
&action name="roleAction_*" class="roleAction" method="{1}"&
&result name="list"&/role/ListRole.jsp&/result&
3.adduser.jsp中代码如下:
&s:form action="nuserAction_Add" method="post"&
&s:action name="roleAction_List" id="role"&&/s:action&
&s:select list="#role.list" label="权限" name="nuser.role.id" headerKey="-1" headerValue="--请选择--" listKey="id" listValue="position"&&/s:select&
&s:textfield name="nuser.name" label="用户名" value=""&&/s:textfield&
&s:password name="nuser.password" label="密码" value=""&&/s:password&
&s:submit value="提交"&&/s:submit&
&s:reset value="重置"&&/s:reset&
此处通过action标签 先执行roleAction_List 来获取 属性list值 然后赋给select标签的list属性
来生成下拉菜单。
有时候能够正常显示 但是有时又会报错 异常如下:
严重: Servlet.service() for servlet jsp threw exception
tag 'select', field 'list', name 'nuser.role.id': The requested list key '#role.list' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
at org.ponent.fieldError(Component.java:237)
不知道什么情况 请各位帮忙看看!
问题补充:&div class="quote_title"&visoin 写道&/div&&div class="quote_div"&#role.list
&br /&你这个不是集合类
&br /&
&br /&&/div&
&br /&list是action的属性
&br /&难道不能通过 &s:action id=""/& id 属性来引用action里的属性吗
问题补充:&div class="quote_title"&asyty 写道&/div&&div class="quote_div"&不行的话直接把list放到request里好了
&br /&
&br /&
&br /&&pre name="code" class="java"&
public String List() throws Exception {&
&&&&&&& /*
&&&&&&&& * 浏览权限
&&&&&&&& */&
&&&&&&& if (this.isRole()) {&
&&&&&&&&&&& this.list = this.roleService.get();&
&&&&&&&&&&& System.out.println(this.getList());&
ServletActionContext.getRequest().setAttribute("roleList",list);
&&&&&&&&&&& return "list";&
&&&&&&& } else&
&&&&&&&&&&& return ERROR;&
&/pre&
&br /&
&br /&&pre name="code" class="java"&
&s:select list="#request.roleList" label="权限" name="nuser.role.id" headerKey="-1" headerValue="--请选择--" listKey="id" listValue="position"&&/s:select&
&/pre&&/div&
&br /&
&br /&&div class="quote_title"&visoin 写道&/div&&div class="quote_div"&#role.list
&br /&你这个不是集合类
&br /&
&br /&&/div&
&br /&搞明白了 我做的时候 弄了 权限设置 导致非权限用户登录后 不能执行roleAction里的List方法 所以 list为空 也就不是集合啦 !
&br /&谢谢指点!
采纳的答案
#role.list
你这个不是集合类
不行的话直接把list放到request里好了
public String List() throws Exception {
* 浏览权限
if (this.isRole()) {
this.list = this.roleService.get();
System.out.println(this.getList());
ServletActionContext.getRequest().setAttribute("roleList",list);
return "list";
return ERROR;
&s:select list="#request.roleList" label="权限" name="nuser.role.id" headerKey="-1" headerValue="--请选择--" listKey="id" listValue="position"&&/s:select&
已解决问题
未解决问题

我要回帖

更多关于 struts2 action标签 的文章

 

随机推荐