Spring MVC控制器的两种实现
程序员文章站
2024-02-28 19:03:10
...
1.基于Controller接口的控制器:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--1.配置spring分发器(是总的控制中心 被拦截的url会汇聚到该servlet) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<!-- servlet对应的Java类 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置spring上下文 (从该目录下加载spring mvc的配置文件),contextConfigLocation是参数名称,该参数的值包括spring MVC的配置文件路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<!-- tomcat启动后立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--2. 配置spring拦截的url模板 以.do结尾的url-->
<servlet-mapping>
<!--请求对应的Servlet的名称-->
<servlet-name>springmvc</servlet-name>
<!--监听当前域的所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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 ">
<!--配置Handle,映射"/hello请求"-->
<bean name="/hello" class="com.spring.controller.HelloController"/>
<!--处理映射器将bean 的name作为url进行查找,需要在配置Handle时指定name(即url)-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--SimpleControllerHandlerAdapter是一个处理器适配器,所有处理器适配器都要实现HandlerAdapter接口-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
HelloController.java
package com.spring.controller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
private static final Log logger = LogFactory.getLog(HelloController.class);
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("handleRequest被调用。。。");
//创建准备返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象
ModelAndView mv = new ModelAndView();
//添加模型数据,可以是任意的pojo对象
mv.addObject("message","SpringMVC测试页面。。。");
//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
mv.setViewName("/index.jsp");
//返回ModelAndView对象
return mv;
}
}
浏览器输入url: http://localhost:8080/hello
2.基于注解的控制器:
新建springmvc-config2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--spring可以去扫描base-pack下面的包或者子包下面的Java文件-->
<context:component-scan base-package="com.spring.controller"/>
<!--配置类型annotation的处理映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--配置annotation类型的处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
或者:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--spring可以去扫描base-pack下面的包或者子包下面的Java文件-->
<context:component-scan base-package="com.spring.controller"/>
<mvc:annotation-driven/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
因为<mvc:annotation-driven/>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,是Spring MVC为@Controllers分发请求所必需的,并提供了数据绑定支持、@NumberFormatannotation支持、@DateTimeFormat支持、@Valid支持、读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能。
新建HelloController2.java
package com.spring.controller;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.stereotype.Controller;
@Controller
public class HelloController2{
private static final Log logger = LogFactory.getLog(HelloController2.class);
@RequestMapping("/hello2")
public ModelAndView hello2(){
logger.info("handleRequest被调用。。。");
//创建准备返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象
ModelAndView mv = new ModelAndView();
//添加模型数据,可以是任意的pojo对象
mv.addObject("message","SpringMVC注解类型控制器测试页面。。。");
//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
mv.setViewName("/index2.jsp");
//返回ModelAndView对象
return mv;
}
}
浏览器输入:http://localhost:8080/hello2
<context:component-scan base-package="com.spring.controller"/>说明:
<context:component-scan />元素的功能为:启动包扫描功能,以便注册带有@Controller、@Service、@respository、@Component等注解的类成为Spring的Bean。
base-package属性指定了需要扫描的类包,类包及其递归的子包中所有的类都会被处理。如com.spring.controller包下的所有类都将被扫描。因此在实际开发过程中应将控制器放在同一个包下,避免扫描无关的java类。