SpringMVC04controller中定义多个方法
public class MyController extends MultiActionController { // 新增 方法修饰符要是public public ModelAndView add(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView("/WEB-INF/jsp/success.jsp", "result", "add()"); } // 修改 public ModelAndView update(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView("/WEB-INF/jsp/success.jsp", "result", "update()"); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 配置一个处理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <!-- 因为我们的controller继承了MultiActionController, 在MultiActionController有个 /** Delegate that knows how to determine method names from incoming requests */ private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver(); 根据我们的请求中参数找到对应方法 的解析器 *:代表的就是我们的请求参数 也是对应的方法名 --> <entry key="/user/*" value="myController"/> </map> </property> </bean> <!-- 处理器 --> <bean id="myController" class="cn.bdqn.controller.MyController"> <property name="methodNameResolver" ref="myResolver"></property> </bean> </beans>
使用我们自身设置的解析器 来执行,不需要改变controller中的代码!只需要更改mvc核心xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 配置一个处理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <!-- 因为我们的controller继承了MultiActionController, 在MultiActionController有个 /** Delegate that knows how to determine method names from incoming requests */ private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver(); 根据我们的请求中参数找到对应方法 的解析器 *:代表的就是我们的请求参数 也是对应的方法名 --> <entry key="/user/*" value="myController"/> </map> </property> </bean> <!-- 设置解析器 --> <bean id="myResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> <property name="mappings"> <props> <!-- 底层代码 Set explicit URL to method name mappings through a Properties object. @param mappings Properties with URL as key and method name as value public void setMappings(Properties mappings) { this.mappings = mappings; } --> <prop key="/user/adds">add</prop> <prop key="/user/updates">update</prop> </props> </property> </bean> <!-- 处理器 --> <bean id="myController" class="cn.bdqn.controller.MyController"> <!--需要更改父类的解析器引用 变成我们自已定义的解析器 --> <property name="methodNameResolver" ref="myResolver"/> </bean> </beans>
一旦我们设置了解析器,那么默认的
会执行我们设置的解析器
PropertiesMethodNameResolver
在浏览器中输入对应的url即可看到效果!
视图解析器
/** 01 .内部资源视图 public class MyController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { // success 就是我们说的 逻辑试图名称 return new ModelAndView("success", "result", "add()"); } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 处理器 --> <bean name="/myController" class="cn.bdqn.controller.MyController"/> <!-- 使用我们默认的试图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- InternalResourceViewResolver 没有给前缀和后缀赋值 需要我们手动的赋值--> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans> 02. 内部资源视图 public class MyController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { // success 就是我们说的 逻辑试图名称 return new ModelAndView("myView", "result", "jstlView"); } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 处理器 --> <bean name="/myController" class="cn.bdqn.controller.MyController"/> <!--内部资源视图 --> <bean id="myView" class="org.springframework.web.servlet.view.JstlView"> <property name="url" value="/WEB-INF/jsp/success.jsp"/> <!-- <property name="url" value="http://www.jd.com"/> 不能跳转到外部的资源路径--> </bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> </beans> 03.外部资源视图 public class MyController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { // success 就是我们说的 逻辑试图名称 return new ModelAndView("jd"); } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 处理器 --> <bean name="/myController" class="cn.bdqn.controller.MyController"/> <!--外部资源视图 --> <bean id="jd" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://www.jd.com"/> </bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> </beans> */
访问外部资源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%-- 这里的参数要和 配置文件中ParameterMethodNameResolver的paramName属性的value值相对应--%> <a href="myController?action=taobao">淘宝</a> <a href="myController?action=jd">京东</a> <a href="myController?action=baidu">百度</a> </body> </html>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 参数名称 映射成 方法名称 --> <bean id="parameter" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"/> <!-- 处理器 --> <bean name="/myController" class="cn.bdqn.controller.MyController"> <property name="methodNameResolver" ref="parameter"/> </bean> <!-- 配置视图解析器 解析xml文件 --> <bean class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="location" value="classpath:MyViews.xml"/> </bean> </beans>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!--外部资源视图 --> <bean id="jd" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://www.jd.com"/> </bean> <!--外部资源视图 --> <bean id="taobao" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://www.taobao.com"/> </bean> <!--外部资源视图 --> <bean id="baidu" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://www.baidu.com"/> </bean> </beans>
public class MyController extends MultiActionController { // 淘宝主页 public ModelAndView taobao(HttpServletRequest request, HttpServletResponse response) throws Exception { // success 就是我们说的 逻辑试图名称 return new ModelAndView("taobao"); } // 京东主页 public ModelAndView jd(HttpServletRequest request, HttpServletResponse response) throws Exception { // success 就是我们说的 逻辑试图名称 return new ModelAndView("jd"); } // 百度主页 public ModelAndView baidu(HttpServletRequest request, HttpServletResponse response) throws Exception { // success 就是我们说的 逻辑试图名称 return new ModelAndView("baidu"); } }
======================使用properties文件管理视图===========================
前台的页面还是使用的上面例子中的index.jsp
jd.(class)=org.springframework.web.servlet.view.RedirectView jd.url=http://www.taobao.com taobao.(class)=org.springframework.web.servlet.view.RedirectView taobao.url=http://www.taobao.com baidu.(class)=org.springframework.web.servlet.view.RedirectView baidu.url=http://www.baidu.com
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 参数名称 映射成 方法名称 --> <bean id="parameter" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"/> <!-- 处理器 --> <bean name="/myController" class="cn.bdqn.controller.MyController"> <property name="methodNameResolver" ref="parameter"/> </bean> <!-- 配置视图解析器 解析properties文件 --> <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <!--找到我们指定的properties文件 value就是代表的文件的名称 不需要加后缀名 --> <property name="basename" value="myViews"/> </bean> </beans>
=====================xml文件中同时存在多个视图解析器的执行顺序======================
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 参数名称 映射成 方法名称 --> <bean id="parameter" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"/> <!-- 处理器 --> <bean name="/myController" class="cn.bdqn.controller.MyController"> <property name="methodNameResolver" ref="parameter"/> </bean> <!-- 如果是定义了多个 视图解析器 默认是按照在xml文件中的配置顺序 执行的 如果不想使用默认的执行顺序 可以增加属性 order 设置一个正整数 数值越小 优先级越高 --> <!-- 解析xml文件 --> <bean class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="location" value="classpath:MyViews.xml"/> <property name="order" value="3"/> </bean> <!-- 配置视图解析器 解析properties文件 --> <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <!--找到我们指定的properties文件 value就是代表的文件的名称 不需要加后缀名 --> <property name="basename" value="myViews"/> <property name="order" value="2"/> </bean> </beans>