美文网首页
SpringMVC 入门

SpringMVC 入门

作者: 王二麻子88 | 来源:发表于2021-06-27 23:31 被阅读0次

web开发其实万变不离其宗,就是使用servlet的使用

SpringMVC(也就是 Spring Web MVC)就是一个Spring。

Spring是容器,

ioc能够管理对象,使用 <bean>, @Compoent, @Repository, @Service, @Controller

SpringMVC能够创建对象, 放入容器中(Spring容器) SpringMVC容器中放的是控制器对象

SpringMVC中有一个对象Servlet: DispatchServlet (中央调度器)

SpringMVC流程

index.jsp --> DispatchServlet --> Controller

一. 创建SpringMVC项目

  1. 创建一个空工程项目
  2. 新建Module
  3. 选择Maven
  4. 勾选 Create from archetype
  5. 选择maven-archetype-webapp
  6. 确定 groupId 和 artifactId
  7. 创建结束

二. 运行SpringMVC项目

  1. 加入Spring-webmvc的maven依赖

    其中会间接地把Spring依赖都加入项目中

  2. 加入 jsp, servlet依赖

  3. 在 web.xml中注册SpringMVC核心对象DispatchServlet

  4. 创建一个发送请求的页面, 例如 index.jsp

  5. 创建控制类

    1. 在类上加入@Controller注解, 创建对象,并放入到SpringMVC容器中
    2. 在类中的方法上加入 @RequestMapping注解
  6. 创建一个作为结果的页面, 例如 result.jsp

  7. 创建一个SpringMVC的配置文件

    1. 声明组件扫描器, 指定@Controller注解所在的包名
    2. 声明视图扫描器, 帮助处理视图

2.1 操作过程

在main文件夹子级中创建 Java文件夹和resources文件夹

将Java文件夹 右键 make director as --> sources root

在 pom.xml文件中写入:

<!-- servlet 依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<!-- 加入SpringMVC 依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>

因为 默认生成的 web.xml文件版本较老, 需要更新一个

打开 项目结构, 选择 module 选择 web, 删除默认的文件, 再追加新的文件 (注: 新加时可能需要先改下web.xml的名字, 生成成功之后再改回来)

在web.xml中编辑配置 servlet:

<servlet>
    <!-- springMVC 创建容器对象时,读取的默认配置是 /WEB-INF/<servlet-name>-servlet.xml -->
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 自定义spring MVC读取的配置文件的位置 -->
    <init-param>
        <!-- springmvc的配置文件的位置属性 -->
        <param-name>contextConfigLocation</param-name>
        <!-- 指定自定义配置的位置 -->
        <!-- classpath --> 指的是 项目中的resources路径 -->
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 在 tomcat启动之后, 创建Servlet对象
        load-on-startup 表示 tomcat启动之后创建对象的顺序。它的值是一个整数, 数值越小,
                        tomcat创建对象的时间就越早
        -->
    <load-on-startup>1</load-on-startup>
</servlet>

同时配置路由映射:

<servlet-mapping>
    <!-- 指定映射接管的servlet配置名 -->
    <servlet-name>springmvc</servlet-name>
    <!-- 在使用框架的过程中, url-pattern 有两个值可以使用
            1. 使用扩展名方式, 语法 *.xxx, xxxxx是自定义扩展名。 常见的方式 *.do, *.action
            2.  / 斜杠
         -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

在 Controller中处理路由映射的内容

@Controller
public class MyController {
    // 使用方法来处理用户的请求
    /**
     * 准备使用 doSome方法处理 some.do请求
     * @RequestMapping  请求映射, 作用是把一个请求地址和一个方法绑定在一起
     *                  一个请求指定一个方法处理
     *                  属性:
     *
     * @return
     */
    // 接受前往 /some.do的路径请求
    @RequestMapping(value = "some.do")
    public ModelAndView doSome() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "hello");
        ArrayList<String> stars = new ArrayList<>();
        stars.add("wang");
        stars.add("er");
        stars.add("ma");
        stars.add("zi");
        mv.addObject("stars",stars);

        // 指定视图
        mv.setViewName("/show.jsp");

        // 返回视图层
        return mv;
    }
}

配置 SpringMVC自动扫描 Controller处理器 (springmvc.xml)

<!-- 声明组件扫描器 -->
<context:component-scan base-package="io.wang.github.controller" />

2.2 SpringMVC请求流程

  1. a链接发起请求
  2. 经过tomcat服务器
  3. 通过 web.xml 中的 url-pattern 获取相应的 DispatchServlet
  4. DispatchServlet(根据springmvc.xml配置获悉相应请求路径对应的Controller方法)
  5. DispatchServlet把请求路径转发给对应的Controller方法
  6. springmvc执行Controller方法把ModeAndView进行处理, 返回到页面中

简化为:

url --> DispatchServlet --> Controller

2.3 配置视图解析器

为了避免用户直接访问服务器中对应的jsp造成数据渲染的异常

可以将对应的jsp文件放置到 WEB-INF 中, 因为放置在这个文件夹里面的内容是不对用户开放的

在 springmvc.xml 中配置

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 前缀 视图文件的路径 (从根路径开始算) -->
    <property name="prefix" value="/WEB-INF/views/" />

    <!-- 后缀 视图文件的扩展名 -->
    <property name="suffix" value=".jsp" />
</bean>

在Controller中使用

@Controller
public class MyController {
    @RequestMapping(value = "some.do")
    // @RequestMapping(value = {"some.do", "other.do"}) 多个请求访问同一方法
    public ModelAndView doSome() {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "hello");
        // 指定视图
        //    mv.setViewName("/WEB-INF/views/show.jsp");
        // 使用视图解析器之后
        mv.setViewName("show");
        return mv;
    }
}

2.4 请求方法/请求参数

设置路径的请求方法

在 Controller 中:

@RequestMapping(value = "/get.do", method = RequestMethod.GET)
public ModelAndView doGet() {
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg", "hello");
    mv.setViewName("show");
    return mv;
}

@RequestMapping(value = "/post.do", method = RequestMethod.POST)
public ModelAndView doPost() {
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg", "hello");
    mv.setViewName("show");
    return mv;
}

获取请求参数

处理器方法包含以下四种方法:

  • HttpServletRequest request
  • HttpResponse response
  • HttpSession session
  • 请求中所携带的参数

继续在 Controller 中:

@RequestMapping(value = "/post.do", method = RequestMethod.POST)
public ModelAndView doPost(HttpServletRequest request) {
    ModelAndView mv = new ModelAndView();
    mv.addObject("name", request.getParameter("name"));
    mv.addObject("age", request.getParameter("age"));
    mv.addObject("msg", "hello");
    mv.setViewName("show");
    return mv;
}

注意: 在默认的情况下, post方法传递中文, 在接受时会出现乱码的行为

此时就是需要引入过滤器, 进行统一编码格式

在 web.xml 中进行配置

<!-- 注册声明过滤器, 解决post方法中, 中文乱码的问题 -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 设置项目中使用的编码 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
    <!-- 强制请求对象(HttpServlet)使用encoding编码方式 -->
    <init-param>
        <param-name>forceRequestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <!-- 设置响应对象使用encoding编码方式 -->
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<!-- 配置过滤器的映射路径 -->
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

对象接受参数方法:

@RequestMapping(value = "/get.do")
public ModelAndView doGet(User user) {
    ModelAndView mv = new ModelAndView();
    mv.addObject("name", user.getName());
    mv.addObject("age", user.getAge());
    mv.addObject("msg", "hello");
    mv.setViewName("show");
    return mv;
}

2.5 请求相应对象

JSON操作需要引入 Jackson依赖

传统方法:

@RequestMapping(value = "/returnAjax.do")
public void returnAjax(HttpServletResponse response, User user) throws IOException {
    System.out.println("===return Ajax ====, name=" + user.getName() + "age" + user.getAge());
    // 处理 Ajax, 使用 json做数据结构
    // service 调用完成, 使用User表示处理结果
    String jsonStr = "";
    if (user != null) {
        ObjectMapper om = new ObjectMapper();
        jsonStr = om.writeValueAsString(user);
        System.out.println("User 类转换成 jsonString=====" + jsonStr);
    }
    // 输出数据响应 Ajax的请求
    response.setContentType("application/json;charset=utf-8");
    PrintWriter writer = response.getWriter();
    // 写入响应内容
    writer.println(jsonStr);
    // 重新刷新数据
    writer.flush();
    // 关闭资源, 释放内存
    writer.close();
}

使用框架的方法

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

    <!-- 声明组件扫描器 -->
    <context:component-scan base-package="io.wang.github.controller" />

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 视图文件的路径 (从根路径开始算) -->
        <property name="prefix" value="/WEB-INF/views/" />

        <!-- 后缀 视图文件的扩展名 -->
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 加入注解驱动 -->
    <mvc:annotation-driven />
</beans>

在 Controller中使用注解:

@RequestMapping(value = "/returnAjaxObject.do")
@ResponseBody
public User returnAjaxObject (User user) {
    return user;
}

相关文章

网友评论

      本文标题:SpringMVC 入门

      本文链接:https://www.haomeiwen.com/subject/trufultx.html