struts2 访问不了jsp访问动作类和jsp的区别

jsp struts2过滤器和拦截器的比较及未登录用户权限限制的实现
| 红颜丽人
struts2需要实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。过程:因为对过滤器和拦截器都不熟悉,开始两种方式都问题不断,后调试通过,贴在这里留作小结和备忘
过滤器filter实现
配置:web.xml
[xhtml] view plaincopyprint?
&filter-name&RightFilter&/filter-name&
&filter-class&com.***.rights.RightFilter&/filter-class&
&filter-mapping&
&filter-name&RightFilter&/filter-name&
&url-pattern&*.jsp&/url-pattern&
&/filter-mapping&
&filter-mapping&
&filter-name&RightFilter&/filter-name&
&url-pattern&*.action&/url-pattern&
&/filter-mapping&
&filter-name&RightFilter&/filter-name&
&filter-class&com.***.rights.RightFilter&/filter-class&
&filter-mapping&
&filter-name&RightFilter&/filter-name&
&url-pattern&*.jsp&/url-pattern&
&/filter-mapping&
&filter-mapping&
&filter-name&RightFilter&/filter-name&
&url-pattern&*.action&/url-pattern&
&/filter-mapping&
[java] view plaincopyprint?
mport java.io.IOE
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
public class RightFilter extends HttpServlet implements Filter {
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) arg1;
HttpServletRequest request=(HttpServletRequest)arg0;
HttpSession session = request.getSession(true);
String usercode = (String) session.getAttribute(“usercode”);//
String url=request.getRequestURI();
if(usercode==null || usercode.equals(“”))
//判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转
if(url!=null && !url.equals(“”) && ( url.indexOf(“Login”)&0 && url.indexOf(“login”)&0 ))
response.sendRedirect(“登录路径”);
//已通过验证,用户访问继续
arg2.doFilter(arg0, arg1);
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
mport java.io.IOE
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
public class RightFilter extends HttpServlet implements Filter {
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) arg1;
HttpServletRequest request=(HttpServletRequest)arg0;
HttpSession session = request.getSession(true);
String usercode = (String) session.getAttribute(“usercode”);//
String url=request.getRequestURI();
if(usercode==null || usercode.equals(“”))
//判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转
if(url!=null && !url.equals(“”) && ( url.indexOf(“Login”)&0 && url.indexOf(“login”)&0 ))
response.sendRedirect(“登录路径”);
//已通过验证,用户访问继续
arg2.doFilter(arg0, arg1);
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect(“”)等方法
跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤
拦截器interceptor实现:
配置:struts.xml
[xhtml] view plaincopyprint?
&interceptors&
&!–定义一个名为authority的拦截器–&
&interceptor
class=”com.***.rights.RightInterceptor” name=”rightInterceptor”/&
&!–定义一个包含权限检查的拦截器栈–&
&interceptor-stack name=”mydefault”&
&!–配置内建默认拦截器–&
&interceptor-ref name=”defaultStack”/&
&!–配置自定义的拦截器–&
&interceptor-ref name=”rightInterceptor”/&
&/interceptor-stack&
&/interceptors&
&default-interceptor-ref name=”mydefault” /&
&!–定义全局Result–&
&global-results&
&result name=”login”&Login.jsp&/result&
&result name=”error”&/error.jsp &/result&
&/global-results&
&interceptors&
&!–定义一个名为authority的拦截器–&
&interceptor
name=”rightInterceptor”/&
&!–定义一个包含权限检查的拦截器栈–&
&interceptor-stack name=”mydefault”&
&!–配置内建默认拦截器–&
&interceptor-ref name=”defaultStack”/&
&!–配置自定义的拦截器–&
&interceptor-ref name=”rightInterceptor”/&
&/interceptor-stack&
&/interceptors&
&default-interceptor-ref name=”mydefault” /&
&!–定义全局Result–&
&global-results&
&result name=”login”&Login.jsp&/result&
&result name=”error”&/error.jsp &/result&
&/global-results&
[java] view plaincopyprint?
import java.util.HashM
import java.util.M
import com.opensymphony.xwork2.A
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
import com.opensymphony.xwork2.ActionC
public class RightInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
//System.out.println(“拦截器开始验证”);
ActionContext actionContext = ActionContext.getContext();
Map&String,Object& session = actionContext.getSession();
String user=session.get(“usercode”).toString();
//当前用户session无效且访问的action不是登录action时,执行拦截,跳转
if((user==null || user.equals(“”)) && !invocation.getAction().getClass().getName().equals(“登录action”))
return Action.LOGIN;
catch(Exception e)
e.printStackTrace();
return Action.LOGIN;
//System.out.println(“拦截器通过验证”);
return invocation.invoke();//执行访问的action
import java.util.HashM
import java.util.M
import com.opensymphony.xwork2.A
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
import com.opensymphony.xwork2.ActionC
public class RightInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
//System.out.println(“拦截器开始验证”);
ActionContext actionContext = ActionContext.getContext();
Map&String,Object& session = actionContext.getSession();
String user=session.get(“usercode”).toString();
//当前用户session无效且访问的action不是登录action时,执行拦截,跳转
if((user==null || user.equals(“”)) && !invocation.getAction().getClass().getName().equals(“登录action”))
return Action.LOGIN;
catch(Exception e)
e.printStackTrace();
return Action.LOGIN;
//System.out.println(“拦截器通过验证”);
return invocation.invoke();//执行访问的action
拦截器由spring管理,只对action起作用,不能拦截jsp页面、图片等其他资源。拦截器截获用户对action的访问,如需要跳转,只需如action一样返回一个result,spring根据result的配置执行跳转。如无需跳转,可调用invocation.invoke();方法来执行用户请求的action。拦截器在action之前开始,在action完成后结束(如被拦截,action根本不执行)
如不进行处理,过滤器和拦截器都会将正常的登录操作屏蔽,因此过滤器中需要判断用户访问的url是否为登录操作或登录页面,拦截器中需要判断用户访问的action是否登录action。(暂未考虑其他区分方法,留问。)
http://blog.csdn.net/zlcoy_1/article/details/5009198
本文链接地址:
本条目发布于 。属于
分类。作者是 。*FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
注意:在新的版本中(&2.1.3)使用StrutsPrepareAndExecuteFilter代替了FilterDispather充当核心处理器。
org.apache.struts2.dispatcher.FilterDispatcher
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
*ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
* ActionProxy是一个特别的中间层,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
* ConfigurationManager是xwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。
* struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置等。
* ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。
* Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter。
* Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
* Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。
* Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
* Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。
1.action可以是一个普通的pojo,包含execute方法,实现Action接口或继承ActionSupport(也实现Action接口)类皆是为了拥有更多的功能。
例如ActionSupport除了继承Action接口外还实现了Validateable,Validateaware等接口提供如验证功能等。
2.数据绑定: 属性驱动,直接域对象(页面需要加前缀,如user.age),模型驱动(实现ModelDriven接口,省写setter/gettter,且页面不需要加前缀)
3.Action的配置(struts.xml)
&&& &package name="base" namespace="/base" extends="struts-default"&
&&&&&&&&&& &action name="userAction" class="pany.demo.UserAction"&
&&&&&&&&&&&&&&&&&&& &result name="success"&/main.jsp&/result&
&&&&&&&&&&&&&&&&&&& &result name="input"&/main.jsp&/result&
&&&&&&&&&&& &/action&
&&& &/package&
&package&元素还有abstract属性,定义包为抽象,即不能包含Action元素,可选项,struts-default就是一个抽象包。
action中有method属性,指定具体Action中的哪个方法,不指定就默认是execute方法,另外也可以通过在请求的URL中直接指定,这样就不需要在struts.xml中配置,方式是,在URL后加感叹号和方法名。例如:/base/userAction!add.action
某些情况下class属性可以不写(默认是ActionSupport)
预定义的result常量:
SUCCESS:表示Action执行成功,显示结果视图给用户,值为字符串"success"
NONE:表示Action执行成功,不需要显示视图给用户,值为字符串"none"
ERROR:表示Action执行失败,显示错误页面给用户,值为字符串"error"
INPUT:表示执行Action需要更多的输入信息,回到input对应的页面,值为字符串"input"
LOGIN:表示因用户没有登录而没有正确执行,将返回登录视图,值为字符串"login"
result还有type属性,即ResultType,表示使用何种视图技术。不配置时,默认值为"dispatcher",表示页面跳转,相当于Servlet中的RequestDispather,此外还有chain,freemarker,redirect,redirectAction,stream,velocity,xslt,plainText
可以配置全局的result,例如异常页面,登录页面等。通过&global-result&来配置:
&global-result&
&&& &result name="login"&/login.jsp&/result&
&&& &result name="500"&/error/500.jsp&/result&
&/global-result&
5.struts2异常映射
在&action&元素中配置&exception-mapping&元素
&action name="" class=""&
&&& &exception-mapping name="math-exception"&java.lang.ArithmeticException&/exception-mapping&
&&& &exception-mapping name="math-exception"&java.lang.Exception&/exception-mapping&
&&& &result name="math-exception"&/error/error.jsp&/result&
在execute()方法的异常捕获中只需要返回 "math-exception"即可。
此外还可以配置全局异常映射。
&global-exception-mappings&
&exception-mapping ....&...
&/global-exception-mappings&
可以在页面通过&s property value="exception"/& &s: property value="exceptionStack"/&方式实现
struts2通过拦截器(interceptor)实现了AOP。struts2的拦截器有点类似与Filter,但比Filter更强大,如与Servlet的API无关,可以访问到值栈等。action的数据绑定就是通过预定义拦截器实现的。
struts2有很多预定义拦截器,定义在struts-default.xml中。
7.值栈和OGNL
&s:property value="userName"/&就是通过OGNL表达式访问当前值栈中Action的userName属性值。
可以通过#方式访问除值栈之外的值。
如&s:property value="#parameters.userName"/&
#request.userName #session.userName,#application.userName和#attr.userName
还可以通过关键字@访问静态方法和静态变量,
如&s:property value="@pany.action.UserAction@DEFAULT_NAME"/&
&s:property value="@pany.action.UserAction@getDefaultName()"/&
强大的OGNL还可以访问list,array,map相关属性及元素。如&s:property value="userMap.size"/&
也可以构建相关list和map等。如&s:property value="{1,2,3}"/&&s:property value="{1,2,3}[0]"/&
&s:property value="#{'name':'zhangsan','age':'25'}"/&
Action类可以通过实现ServletActionContext访问Servlet的API来获取相关request,response等对象
8.Struts2的标签库Taglib
&%@ taglib prefix="s" uri="/struts-tags" %&&
struts2标签按功能可分为四类:数据标签,控制标签,UI标签,杂项标签
&1&数据标签
property标签 :&s:property value=""/&,其他属性有default,escape,escapeJavaScript
&s:set var="tempUser" value="#session.user"/&&s:property value="#tempUser"/&
&s:set var ="i" value="1"/&&s:set var="i" value="#i+1"/&
set标签的其他属性有scope,可取值application,session,request,page,action
push标签,用来将对象的引用压入值栈中
&s:push value="#session.user"/&
&&& &s:property value="name"/&
&&& &s:property value="age"/&
其他一些常用数据标签有bean,param,date,debug,url,a,include等
&2&控制标签
if、elseif与else标签
&s:if test="#request["listSize"]&20"&
&s:elseif test="#request["listSize"]&10"&
&/s:elseif&
iterator标签,用来遍历数组,Set和List等集合对象
&s:iterator var="i" begin="1" end="10" step="1"&
&&& &s:property value="#i"/&
&/s:iteraror&
&s:iterator value="#request.userList" status="state"&
&&& 索引=&s:property value="#status.index"/&
&& &s:property value="userId"/&
&&& &s:property value="userName"/&
&/s:iterator&
status用来返回循环的各种信息,可以返回的信息有:count,index,even,odd,first,last
append标签,用来将已存在的多个集合合并成一个集合
&s:set value="{1,2,3}" var="list1"/&
&s:set value="{4,5,6}" var="list2"/&
&s:append var="list3"&
&s:param value="#list1"/&
&s:param value="#list2"/&
&/s:append&
&s:iterator value="#list3"&
&s:property/&
&/s:iterator&
generator标签,用来切分字符串,并把切分的结果组成一个集合
&s:generator separator="," val="'a,b,c,d'" var="myList"/&
&s:iterator value="#myList"&
&s:property/&
&/s:iterator&
merge标签,和append标签相似,区别是合并后的大集合中原有集合元素顺序发生改变。
其他控制标签有sort,subset
struts2标签分为Form Tags,Non-Form UI Tags,Ajax Tags
模板和主题:struts2标签是通过模板渲染成相应的HTML代码的,模板是通过freemarker定义的。每个标签都有自己对应的模板。模板在struts2的core包中
struts2提供内建4个主题,包括simple,xhtml,css_html,ajax
struts2以xhtml为默认主题,可以通过&constant name="struts.ui.theme" value="simple"/& 改变默认主题
表单标签有很多通用属性,包括name,value,cssClass,cssStyle,cssErrorClass,cssErrorStyle,onBlur,onChange...
表单标签除了常见的textfield,textarea,hidden,submit,,password,radio,checkbox,label,select,optgroup,file等之外,
还有checkboxlist,head,combobox,updownselect,optiontransferselect,doubleselect等
9.验证框架
通过添加Action名称-validation.xml,如RegisterAction-validation.xml
内容类似如下:
&validators&
&field name="user.name"&
&field-validator type="requiredstring"&
&message&请填入姓名&/message&
&/field-validator&
&field name="user.age"&
&field-validator type="int"&
&param name="min"&18&/param&
&message&年龄必须在18岁以上&/message&
&/field-validator&
&/validators&
struts2提供了很多内置验证器,如required,requiredstring,email,date,url,int,double,regex,expression等等
在页面显示验证错误信息方式是通过&s:actionerror/&&s:fielderror/&或&s:fielderror fieldName="user.name"/&来实现。
需要struts2-convention-plugin-*.jar包支持
public class HelloWorldAction extends ActionSupport{
&&& @Action(value="/annoAction",
&&&&&&&&&& params={"str","param1","str2","param2"},
&&&&&&&&&& results={&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&& @Result(name="success",location="/anno/success.jsp"),&&&&&&&&&&
&&&&&&&&&&&& @Result(name="another",location="/anno/another.jsp")
&&&&&&&&&& },
&&&&&&&&&& interceptorRefs={
&&&&&&&&&&&& @InterceptorRef("timer"),
&&&&&&&&&&&& @InterceptorRef("defaultStack")
&&&&&&&&&& },
&&&&&&&&&& exceptionMappings={
&&&&&&&&&&&& @ExceptionMapping(exception="java.lang.NullPointerException",result="nullError"),
&&&&&&&&&&&& @ExceptionMapping(exception="java.lang.Exception",result="error")
&&&&&&&&&& }
&&& public String method1() throws Exception {
&&&&&& System.out.println("now is HelloWorld=="+str+" , str2="+str2);
&&&&&& return this.SUCCESS;
&&& private String str,str2;
&&& //&setter/getter
此外,还有一些放在类上的注解,如@Result,@Results,@Namespace,@InterceptRef,@InterceptRefs,
@ExceptionMapping,@ExceptionMappings,@ParentPackage等。
参考:http://rubbing-/blog/1661482
阅读(...) 评论()3078人阅读
使用struts, 在jsp页面中,可以通过ognl访问类的静态方法。
表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')
。页面的输出结果就是:foo bar (注:内部类用$)
在目前的项目中,我们使用了struts最新的版本2.1.2,当我在jsp页面中使用ognl访问类的静态方法时,发现不起作用。也没报错信息,找不到原因。网上搜了一下,也未发现相同经历的人。当我把struts的版本降到2.0.11时,发现是可以访问静态方法的,困惑!
最后终于发现了原因,原来是在2.1.2中,如果要通过ognl访问静态方法,必须在struts.properties或者struts.xml中将选项struts.ognl.allowStaticMethodAccess设置为true
struts.properties
struts.ognl.allowStaticMethodAccess=false
struts.xml
&constant name=&struts.ognl.allowStaticMethodAccess& value=&true& /&
&s:property value=&@java.lang.String@format('foo %s', 'bar')&/&
&s:property value=&@com.dw.knowledge.global.GGlobals$SYSTEM@WEB_ROOT&/&
&s:property value=&@com.dw.knowledge.global.GGlobals$SYSTEM$SystemCodeStyle@MAIL_SERVER.name()&/&
&s:property value=&@com.dw.knowledge.global.GGlobals$SYSTEM$SystemCodeStyle@MAIL_SERVER.ordinal()&/&
&s:property value=&@com.dw.knowledge.global.GGlobals@SYSTEM@containsLimitWord('22')&/&
&s:property value=&@com.dw.knowledge.util.CalendarUtil@getCalenDarUtilDate('1')&/&
&s:property value=&@com.dw.knowledge.util.CalendarUtil@format0&/&
&s:property value=&@com.dw.knowledge.util.CalendarUtil@format1&/&
public class CommonConst {
public enum RunModel {
ADD, UPDATE
&s:property value=&@monConst$RunModel@ADD&/&
----------------------------------------
&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
&%@taglib uri=&/struts-tags& prefix=&s&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&显示用户信息&/title&
&s:iterator id=&it& value=&list& status=&st&&
&s:property value=&username& /&---&s:property value=&password& /&--&s:property
value=&gender& /&-----&
& &s:if test=&gender.toString()==@cn.ssh.domain.Gender@MAN.toString()&&男&/s:if&
&s:else&女&/s:else&
&s:if test=&gender.toString()=='MAN'.toString()&&男&/s:if&
&s:else&女&/s:else&
list是action中的
&/s:iterator&
&s:debug&&/s:debug&
也可以采用如下方式
public enum Gender {
public String getSex() {
& return &男&;
public String getSex() {
& return &女&;
&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
&%@taglib uri=&/struts-tags& prefix=&s&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&显示用户信息&/title&
&s:iterator value=&list&&
&s:property value=&username& /&---&s:property value=&password& /&--&s:property value=&gender.sex& /&
&/s:iterator&
&s:debug&&/s:debug&
struts2标签真是强大
----------------------------
另一种判断方法
public class CommonConst {
public enum RunModel {
ADD, UPDATE
action属性
private CommonConst.RunModel runM
&%-- s:if 和枚举比较 --%&
&s:if test=&runModel.toString() == @monConst$RunModel@ADD.toString()&&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:69827次
积分:1097
积分:1097
排名:千里之外
原创:34篇
评论:15条
(1)(2)(3)(3)(9)(3)(1)(4)(3)(1)(1)(1)(1)(1)(2)(3)(1)(1)

我要回帖

更多关于 struts struts2 区别 的文章

 

随机推荐