SpringMVC04controller中定义多个方法

时间:2023-03-10 06:48:32
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()");
} }

创建对应的controller

<?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>

mvc核心xml文件的配置

使用我们自身设置的解析器 来执行,不需要改变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>

mvc核心xml文件的设置

一旦我们设置了解析器,那么默认的

SpringMVC04controller中定义多个方法

SpringMVC04controller中定义多个方法

会执行我们设置的解析器

PropertiesMethodNameResolver

SpringMVC04controller中定义多个方法

在浏览器中输入对应的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>

在webroot下创建index.jsp

<?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>

springmvc-servlet.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="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>

MyViews.xml文件

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");
} }

MyController代码

======================使用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

创建对应的properties文件

<?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文件中同时存在多个视图解析器的执行顺序======================

<?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>

修改后的xml文件