<s:iterator value=
"#stu" id="info">
<s:property value='info.sid'/>
<s:property value='info.name'/>
</s:iterator>
<s:debug></s:debug> 看看是不是写错了?
说明路径不对
..已解决 路径填错了- -!
${pageContext.servletContext.contextPath}/auth.这样放在jsp提交表单的action里面或者超链接的href属性里面。
单词打错,妈的,多少年都没犯这种低级错误了。。。。擦
贴个代码让大家看看
action中没有class属性,只调用了默认的action。
我自己是这样理解的,因为auth没有指定对应的action,所以系统会自动生成一个默认的action,该action默认返回SUCCESS。在视频中,老师第一次通过auth可以直接访问/WEB-INF/page/manager.jsp,就是因为那个默认的action返回了一个SUCCESS,而且,那时候并没有加入我们自定义的拦截器,所以可以直接访问WEB-INF下的文件。后来,我们自定义了的拦截器和拦截器栈,在自定义拦截器中添加了相关的处理代码,并在auth的action中引用了myStack,这时候auth执行的流程发生了变化。当用户直接在URL中输入auth后,这时候它会经过多个拦截器,自然也会被我们自定义的拦截器拦截到,接着执行拦截器中的处理代码,判断用户是否成功登陆过,如果没有成功登陆过,则返回登陆页面;如果已成功登陆过,则通过invoke()方法调用默认的action,因为默认的action默认返回SUCCESS,然后跳转到/WEB-INF/page/manager.jsp页面。整个执行的流程应该就是这样子的。。。
回头去看下第4章的“Struts2内建拦截器”,你就知道答案了
struts2默认只拦截以.action或者无后缀名得了url,不会拦截jsp或者html文件
因为在项目生成后,在web.xml中有默认的配置跳转到index.jsp
如果添加
System.out.println(user.getUsername())
这个之后,默认拦截器栈中的参数拦截器生效,如果想让其生效,需要在引用自定义拦截器之前配置默认拦截器.如果不添加这句的话,自定义拦截器生效.
这个不是必须要继承类来实现自定义拦截器,
可以根据具体情况使用,需要更好的可扩展性时,使用接口比较好,毕竟Java只允许单继承,如果对于扩展性没多大要求,继承好一些,可以减少代码量,虽然实现接口比继承多不了几行代码,但是在一个项目中,多的代码量就不少了
你少写了一行 <result name="login">/login.jsp</result>
空指针异常
拦截器不仅要在struts.xml注册,也要在web.xml里注册
在LoginAction.java中已经把登录信息传入到session会话中去了,而ActionContext获取的session是用来获取登录信息的,以判断用户是否已经登录。