SpringMVC学习总结(2)---SpringMVC入门程序:非注解形式和使用注解形式

我们利用Maven创建一个web项目,使用注解的处理器映射器、处理器适配器和非注解的处理器映射器、处理器适配器。

编写SpringMVC程序的步骤:

  1. 需求

  2. 环境准备

  3. 配置前端控制器

  4. 配置处理器适配器

  5. 配置处理器映射器

  6. 配置视图解析器

1. 非注解开发SpringMVC

1.1 需求

向前端页面输出hello world!

1.2 环境配置

Maven及导包注意点

  • 资源过滤问题
  • 导包不要漏

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xaio</groupId>
  <artifactId>SpringMVC-Study01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMVC-Study01 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
    
    
<dependencies>
  <!--junit包单元测试-->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <!-- Spring MVC 及 Spring系列包 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.24.RELEASE</version>
  </dependency>
  <!--jstl 和 jsp的包-->

  <!--Servlet核心-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
  </dependency>
  <!-- JSTL -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>
  
</dependencies>


<build>
    <!--解决资源导出问题-->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
</build>

1.3 注册SpringMVC核心Servlet

  • 注册前端控制器 DispatcherServlet

  • 关联SpringMVC的配置文件,springmvc-servlet.xml

  • 启动级别为1,要和服务器一起启动; load-on-startup,启动级别,数字越小级别越高!

  • 映射路径为 / 【不要用/*,会404】

    【注意】路径配置方式:

    • 第一种:.action ,访问以.action结尾的DispatcherServlet进行解析。
    • 第二种:/ ,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析。
      使用此种方法,可以实现RESTful风格的url。
    • 第三种:/* ,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler进行解析 。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

  <!--1.配置前端控制器 DispatcherServlet-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--关联SpringMVC配置文件-->
    <!--contextConfigLocation:配置springmvc加载的配置文件,配置处理映射器、处理适配器-->
    <!--若不配置,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>

    <!--3.这个东西要和服务器一起启动;
    load-on-startup,启动级别,数字越小级别越高!-->
    <load-on-startup>1</load-on-startup>
  </servlet>


  <!--所有请求都会经过这个DispatcherServlet请求分发器-->
  <!--

  /和/*的区别:
  < url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;
    即:.jsp不会进入spring的 DispatcherServlet类 。
  < url-pattern > /* </ url-pattern > 会匹配*.jsp,
    会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
  -->

  <!--4.映射路径为 /   -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

1.4 编写SpringMVC的配置文件

  • 配置处理器适配器
  • 配置处理器映射器
  • 配置视图解析器

springmvc-servlet.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    
    <!--2. 配置处理器映射器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--请求映射   将url映射到指定的处理器 Controller。
    将自己的类交给SpringIOC容器,注册bean-->
    <bean id="/hello" class="org.xiao.controller.HelloController"/>

    <!--3. 配置处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--4.配置视图解析器-->
    <bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

1.5 编写处理器 Controller类

  • 类需要实现Controller接口 , 可以让IOC容器管理 , 等价于Bean
  • 我们使用ModelAndView来存储处理完的结果数据;显示该数据的视图;
    使用ModelAndView需要自己手动实例化ModelAndView的对象;
  • return modelAndView; 它会去视图解析中拼接前缀和后缀来找到对应的视图

HelloWorldController.java

package org.xiao.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


// 编写处理器Handler,
// 返回Model and View
public class HelloController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        // 封装对象,放在ModelAndView中。
        // 在jsp页面中,通过"msg"取数据
        modelAndView.addObject("msg", "hello world!");
        //指定视图
        modelAndView.setViewName("hello");   //: /WEB-INF/jsp/hello.jsp
        return modelAndView;
    }
}

1.6 视图层

  • 注意视图的位置,要和视图解析器对应 /WEB-INF/jsp ,

    为什么需要在web-inf路径下 ?, 因为这个路径下的东西用户无法直接访问 , 更加安全;

  • 可以通过EL表示取出Model中存放的值,或者对象;

    hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC</title>
</head>
<body>

${msg}

</body>
</html>

1.7 测试

启动Tomcat测试。

1.8 结果

在这里插入图片描述

2. 注解开发SpringMVC

2.1 需求

(同上)

2.2 环境配置

(同上)

2.3 注册SpringMVC核心Servlet

(同上)

2.4 编写SpringMVC的配置文件

  • 配置处理器映射器、处理器适配器

    <mvc:annotation-driven/>
    
  • 让IOC的注解生效

  • 静态资源过滤

  • 视图解析器

    springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!--请求映射-->
    <!-- 让IOC的注解生效-->
    <!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
    <context:component-scan base-package="org.xiao.controller"/>

    <!--2.3.MVC的注解驱动  配置处理器映射器、处理器适配器  -->
    <!--annotation-driven:支持MVC注解驱动 -->
    <mvc:annotation-driven/>

    <!--.静态资源过滤 :HTML  . JS  .   CSS  . 图片 , 视频 .....-->
    <mvc:default-servlet-handler/>

    <!--4.配置视图解析器-->
    <!-- 视图解析器     作用;方便统一管理 -->
    <bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

2.5 编写处理器 Controller类

  • 需要给类加注解 :@Controller , 可以让IOC容器管理 , 等价于Bean

  • 请求映射的路径 :@RequestMapping ("路径"),如果类上有就先写类的,再写方法的;

    若只有方法上有,则请求路径为http://localhost:8080/项目名/方法请求路径;

    若类和方法上都有,则请求路径为http://localhost:8080/项目名/类请求路径/方法请求路径。

  • Model :模型传递参数

  • return "hello"; 它会去视图解析中拼接前缀和后缀来找到对应的视图

    AnnoController.java

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
//@RequestMapping("/hi")  可省
public class AnnoController {

    //请求映射(路径)
    @RequestMapping("/hello")
    // Model是在每次请求中都存在默认参数;
    // 我们利用addAttribute方法将服务器的运行的结果或者程序猿自己写的值传递到jsp页面中;
    // Model拿来即用,当做请求的参数传递进去即可!
    public String hello(Model model){
        model.addAttribute("msg","Hello,SpringMVC");
        System.out.println("进入HELLO");
    	return "hello";    //WEB-INF/jsp/hello.jsp
    }

	//ModelAndView , 模型和视图
    @RequestMapping("/hello2")
    //我们使用ModelAndView来存储处理完的结果数据;显示该数据的视图;
    //使用ModelAndView需要自己手动实例化ModelAndView的对象;
    public ModelAndView hello(HttpServletRequest req, HttpServletResponse resp){
        //业务逻辑
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","Hello,SpringMVC!!");//给ModelAndView放入数据
        mv.setViewName("hello");
        return mv;
    }
}

2.5 视图层

(同上)

2.6 测试

启动Tomcat进行测试。

2.7 结果

若只有方法上有@RequestMapping
在这里插入图片描述
类和方法上都有@RequestMapping
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值