承接Struts2基础复习系列(2)
七、 通配符映射
在第一点的时候讲过,Servlet的缺点中有一条是如果servlet写了多个方法,那么进行操作的时候对于方法的选择必须通过传入一个参数来进行的,显然是不方便的,那么struts的这种通配符映射以及动态方法调用则相对好的解决了这样的问题。
1. 第一种:直接配置
<action name="user" class="com.struts.review1.UserAction">
<result name="success">/success.jsp</result>
</action>
访问url:127.0.0.1:8080/projectName/user.action,默认执行execute方法,只执行一个方法的话显然不可取。
2. 第二种:直接配置
<action method="login" name="user" class="com.struts.review1.UserAction">
<result name="success">/success.jsp</result>
</action>
访问url:127.0.0.1:8080/projectName/user.action,执行login方法,显然如果项目有多个action且多个方法的话,那么这种配置是不可取的,因为会导致action需要配置多个,那么使得struts.xml变的繁琐。
3. 第三种:!访问形式
<action name="user" class="com.struts.review1.UserAction">
<result name="success">/success.jsp</result>
</action>
访问url:127.0.0.1:8080/projectName/user!方法名.action,
如:127.0.0.1:8080/projectName/user!login.action,访问的则是userAction的login方法。
4. 第四种:利用*通配符已经{1}确定方法
<actionmethod="{1}" name="user*" class="com.struts.review1.UserAction">
<result name="success">/success.jsp</result>
</action>
访问url:127.0.0.1:8080/projectName/user方法名.action
如:127.0.0.1:8080/projectName/userlogin.action,访问的则是userAction的login方法。当然userlogin这样不方便看,可以将user*改成user_*也是一样的,只要满足这样的形式即可。
5. 第五种:利用_通配符形式,以及{1}{2}确定action和方法
<action method="{2}" name="*_*" class="com.struts.review1.{1}Action">
<result name="success">/success.jsp</result>
</action>
访问url:127.0.0.1:8080/projectName/action类前缀_方法名.action
如:127.0.0.1:8080/projectName/User_login.action,访问的则是UserAction的login方法。当然不管上面的配置还是这里的都是区分大小写的,要记住,因为这里要匹配UserAction,因此_的第一个必须为大写,且第二个必须为匹配类中所存在的方法名。这种方法不推荐使用,因为覆盖范围过来,不好控制,也容易出错。
基本就这几种映射方法,当然这是最基本的,也可以通过上面的进行修改,比如运用到result也可以的,匹配name,然后{1}根据匹配的值来确定调用的jsp名。如下:
<action method="{1}" name="user_*" class="com.struts.review1.UserAction">
<result name="success">/{1}.jsp</result>
</action>
访问url:127.0.0.1:8080/projectName/user_方法名.action
如:127.0.0.1:8080/projectName/userlogin.action,访问的则是userAction的login方法。然后因为在result中也匹配,因此当login方法返回success时,转发到login.jsp页面,因此要与匹配。
八、 访问Servlet API
有三种方式来访问ServletAPI。
1. 通过ActionContext来访问。
首先ActionContext ctx = ActionContext.getContext();获取ActionContext实例。而后通过调用相应的方法即可。
Object get(String key);类似调用request.getAttribute(String name)方法
void put(String key,Object val);类似调用request.setAttribute(String name,Object obj)方法
Map getParameters();类似调用request.getParameterMap()方法
Map getSession();返回Map对象,类似模拟一个Session实例
void setApplication(Map application);传入一个map实例,以键值对的形式转换成application的属性名和属性值
void setSession(Map session); 传入一个map实例,以键值对的形式转换成session的属性名和属性值
2. 实现接口的方式直接访问Servlet API
实现ServletContextAware,ServletRequestAware,ServletResponseAware接口,可以获取到相应的request,response,context实例,但是使用这种方法又将Servlet容器与action耦合在一起了。
3. 使用ServletActionContext访问ServletAPI
为了能够直接访问ServletAPI,Struts2提供了一个名为ServletActionContext的工具类,通过这个类可以直接访问ServletAPI。主要方法如下: