Spring MVC控制器的两种实现

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类。


发布了34 篇原创文章 · 获赞 20 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/ChengXuYuanXingCheng/article/details/79135470