1、 检查用户是否登录——自定义拦截器
实现自定义拦截器的步骤:
第一步:编写一个普通类,实现Interceptor[ɪntə(r)'septə(r)]接口或者继承接口的实现类AbstractInterceptor/MethodFilterInterceptor(实际开发一般继承MethodFilterInterceptor类,因为它可以控制具体拦截哪个action动作类的方法)
在拦截器类中该干什么还干什么。(如进行判断)
关于最后的放行:
放行:
含义:如果有一个拦截器,执行下一个拦截器,如果该拦截器处于最后一个,则执行动作方法
方法:invocation.invoke();
返回值的含义:就是动作方法的返回值,如下:拦截器中的invocation.invoke();实际上就是返回对应的动作方法的返回值return SUCCESS;
多个拦截器执行顺序:是由引用顺序决定的。
第二步:配置拦截器:
(1)声明拦截器:位置是在package标签中
(2)引用拦截器
在动作类的配置action标签中写:
实际上,如上配置好后就可以进行登录检查,实现拦截的功能。但我们发现:如果我们需要拦截的动作方法很多,则重复的代码很多,如下:
所以,我们试着把重复的代码抽取出来:
首先,我们需要定义一个公共的包(name属性为自定义的包名,abstract属性表示抽象)
然后,我们需要声明一个拦截器
然后,自定义一个拦截器栈(包含我们自己创建的检查登录拦截器以及默认的拦截器栈)
然后,定义默认拦截器栈,(把我们刚刚自定义的拦截器栈设为默认的)
最后,定义一个全局结果视图(因为上图如果没登录,判断后都需要转到登录页面,所以设置全局结果视图)
并且,很重要一点,需要把需要拦截的动作类的配置文件的包的默认继承修改为继承上边的自定义包。
继承之后,才可以实现拦截。
上边对于版块动作的配置,可以直接继承自定义的公共包,就可以了;但是对于用户动作类配置,继承自定义公共包,之后还需要另外配置。原因是:用户动作类中有的方法需要判断是否登录,如修改信息;而有的方法就不需要判断是否登录,也就不需要拦截。所以需要另外配置。
如下图红色框起来的,通过给检查登录拦截器传入排除的方法名称,进而设置登录和注册方法不需要拦截。
这块儿直接配置后就可以使用,还因为动作类继承了MethodFilterInterceptor(实际开发一般继承MethodFilterInterceptor类,因为它可以控制具体拦截哪个action动作类的方法)
多个配置文件,进行引入:
另外,我们发现把版本动作类,用户动作类,以及公共包写在一起,整个配置文件看起来有些乱,其实,我们可以把它们各写成一个配置文件,然后在名称为struts.xml的配置文件中引入另外的配置文件就可以了。引入方法为:
<include file="struts-user.xml"></include>
<include file="struts-bbs.xml"></include>
注意: 如果是在类的根目录下,则直接写配置文件名称。
如果是放到了包里面,则需要些包名/配置文件名称。有几级包,写几个包名
具体知识点:
struts2的控制标签:
1、<s:if>、<s:else>、<s:elseif>
只有<s:if>标签可以单独使用,其它两个必须和<s:if>标签结合使用。
<s:if>、<s:elseif>标签必须设定test属性,该属性用于设置标签的判断条件,其值为boolean类型的条件表达式
2、<s:iterator>标签:
主要用于对集合中的数据进行迭代,它可以根据条件遍历集合中的数据。
struts2的数据标签:
1、<s:property>标签:用于输出指定的值,通常输出的是value属性指定的值,其具体属性如下:
2、<s:a>标签:用于构造html页面中的超链接,具体属性如下:
<s:a>与html中<a>标签使用的区别:
当我们配置了默认拦截的url时,即:
<!-- 修改struts2默认拦截的url -->
<constant name="struts.action.extension" value="action"></constant>
(1) 若是使用<a>标签,则其html属性后的动作类必须加配置的url
(2) 若是使用<s:a>标签则不需要,直接在action属性中写动作类名称就ok,他会自动添加和配置一致的url。
3、<s:debug>标签:用于在调试程序时输出更多的调试信息,主要输出ValueStack和StackContext中的信息,该标签只有一个id属性,且一般不使用。
struts2的表单标签:
struts2的表单标签主要用于向服务器提交用户输入信息。在org.apache.struts2.components包中都有一个对应的类,所有的表单标签对应的类都继承自UIBean类。UIBean类提供了一组公共属性,这些属性是完全通用的
1、<s:form>标签:
用来呈现html语言中的表单元素,其常用属性如下:
2、<s:submit>标签:主要用于产生html中的提交按钮,该表单元素中,可以指定提交的Action对应的方法,常用属性如下:
3、<s:textfield>和<s:textarea>标签:
<s:textfield>用于创建单行文本框,<s:textarea>拥有创建多行文本域。
常用属性:
name:用来指定单行/多行文本框的名称,在Action中通过该属性获取其中的值。
value:该属性用于指定单行/多行文本框的当前值
此外,<s:textarea>标签可以通过clos和rows属性分别指定多行文本域的列数和行数。
4、<s:password>标签:用于创建一个密码输入框。常用属性如下:
5、<s:radio>标签:用于创建单选按钮,常用属性如下:
6、<s:checkboxlist>标签:用于一次性创建多个复选框。常用属性如下:
7、<s:select>标签:用于创建一个下拉列表框。常用属性如下:
8、<s:hidden>标签:用于创建隐藏表单元素。
通常只设置name和value属性。
该标签主要用于需要提交的表单传值时使用。
9、<s:reset>标签:用于创建一个重置按钮。
常用属性为name和value。其中,name属性用于指定重置按钮的名称,value作用域显示按钮的值