Java零基础——SpringMVC篇

1.SpringMVC介绍

SpringMVC是Spring框架中的一个组件,是一个轻量级的web的MVC框架,充当controller,其本质就是一个Servlet。

1.1 传统Servlet的不足

每个请求,都需要定义一个Servlet。虽然可以在service方法中,根据业务标识进行业务分发,但是每个Servlet中的service方法的实现是重复。如果想要对service进行更高层次的封装,就可以解决service的重复代码问题。

每个请求的参数,都需要根据request对象,从Map逐一的获取,单调且含量低。将所有的参数,自动封装映射,简化开发。

request.getParameter(“”)

每个Servlet,向客户端返回数据时,需要单独的处理。

request.getRequestDispatcher(“/路径”).forward(request,response)

Response.sendRedirect(“/路径”)

针对于Servlet在实际使用中的不便,Spring中提供了组件,SpringMVC,更进一步的简化了Servlet的开发。

1.2 SpringMVC的架构

在这里插入图片描述

1.2.1 DispatcherServlet
核心控制器,本质上就是一个Servlet,处理所有的客户端的请求。根据请求的资源路径,在处理器映射器中查找对应的处理器。

1.2.2 HandlerMapping
处理器映射器,存储所有当前程序中的处理器,如果在处理器映射器中查找不到资源路径,直接返回404。

1.2.3 HandlerAdapter
处理器适配器,用于适配各种处理器,调用具体的处理器程序。

1.2.4 Handler
具体处理器,开发者实现相应接口或者使用注解声明的程序。用于处理具体的请求。

1.2.5 ViewResolver
视图解析器,根据处理器返回的数据,进行数据处理,将数据处理成相应的格式。

JSP/JSON等等。

2.SpringMVC使用

2.1 SpringMVC入门使用

2.1.1 导入SpringMVC相关jar包

<?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.example</groupId>
    <artifactId>01-mvc01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- 引入springmvc 相关jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
    </dependencies>
</project>

2.1.2 编写SpringMVC配置文件

<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置了一个自定义的处理器 -->
    <bean id="controller01" name="/controller01.do"  class="com.bjpowernode.controller.Controller01"></bean>
    <bean id="controller02" name="/controller02.do"  class="com.bjpowernode.controller.Controller02"></bean>
    <!-- 开启springmvc 注解 -->
    <!-- 开启组件扫描 -->
    <context:component-scan base-package="com.*" />
    <!-- 开启springmvc 相关注解 -->
    <mvc:annotation-driven />
</beans>

2.1.3 编写相关类

package com.bjpowernode.controller;

import org.springframework.web.HttpRequestHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Controller01 implements HttpRequestHandler {
   
    @Override
    public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
   
        System.out.println("你好啊 springmvc");
    }
}



package com.bjpowernode.controller;

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 Controller02 implements Controller {
   

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
        System.out.println("Hello SpringMVC  02");
        //模型视图
        //模型就是数据
        //视图 界面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name","Hello SpringMVC");
        modelAndView.setViewName("/index.html");//springmvc中 /表示当前项目
        return modelAndView;
    }
}



package com.bjpowernode.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping
public class Controller03 {
   

    @RequestMapping("hello1.do")
    public String hello(String name){
   
        System.out.println("name:"+name);
        System.out.println("你好springmvc");
        return "/index.html";
    }

    @RequestMapping("hello2.do")
    public String hello1(String name){
   
        System.out.println("name:"+name);
        System.out.println("你好springmvc");
        return "/index.html";
    }
}

2.1.4 在web.xml中配置SpringMVC

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置自定义的处理器清单 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 配置服务器启动时 就初始化DispatcherServlet  -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

2.1.5 进行测试

使用bean标签的name属性进行访问。注意,每个名字必须有个/,如果多个名字,之间使用逗号。

2.2 SpringMVC的数据绑定

在SpringMVC中为了简化开发,SpringMVC对请求的参数进行预处理,SpringMVC支持按照参数名称,直接将请求参数封装传递给处理器中的方法,处理无需单独的获取。

2.2.1 请求参数
请求参数,是指基本数据类型和字符串、对象、数组、Map等。

2.2.2 获取请求参数

package com.bjpowernode.controller;

import com.bjpowernode.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/param")
public class ParamController {
   
    /**
     * 处理简单的参数
     * @return
     */
    @RequestMapping("/simple.do")
    public String doSimpleParam(Integer id,boolean flag,String name,@RequestParam("City") String city){
   
        System.out.println("id: "+id);
        System.out.println("flag: "+flag);
        System.out.println("name: "+name);
        System.out.println("city: "+city);
        return  "/success.html";//默认当做内部转发处理  默认当做视图路径
    }

    /**
     * 使用对象接收请求参数
     *      请求参数的名称 必须 和 对象中属性名一致  类型要支持转换
     * @param user
     * @return
     */
    @RequestMapping("/obj.do")
    public String objParam(User user){
   
        System.out.println("id: "+user.getId());
        System.out.println("flag: "+user.getFlag());
        System.out.println("name: "+user.getName());
        return  "/success.html";//默认当做内部转发处理  默认当做视图路径
    }

    /**
     * 使用map接收请求参数
     *  默认是不支持使用map集合接收数据  需要使用注解@RequestParam
     *  RequestParam :
     *      name/value : 绑定请求参数 ,默认根据名称注入值,当名称不一致,可以使用RequestParam设置对应的参数的名称,进行绑定
     *      required : 是否需要这个参数  默认true 如果有使用了RequestParam这个注解,默认必须传这个参数 如果不是必传 设置为 false
     *      defaultValue : 如果没有这个请求参数时或者请求参数值为null 设置默认值
     * @param param
     * @return
     */
    @RequestMapping("/map.do")
    public String mapParam(@RequestParam  Map<String,Object> param){
   
        System.out.println("id: "+param.get("id"));
        System.out.println("flag: "+param.get("flag"));
        System.out.println("name: "+param.get("name"));
        return  "/success.html";//默认当做内部转发处理  默认当做视图路径
    }

    @RequestMapping("/arr.do")
    public String arr(Integer id,boolean flag,String name,String[] likes){
   
        System.out.println("id: "+id);
        System.out.println("flag: "+flag);
        System.out.println("name: "+name);
        List<String> strings = Arrays.asList(likes);
        System.out.println(strings);
        return  "/success.html";//默认当做内部转发处理  默认当做视图路径
    }

    @RequestMapping("/list.do")
    public String arr(Integer id,boolean flag,String name,@RequestParam("likes") List<String> likes){
   
        System.out.println("id: "+id);
        System.out.println("flag: "+flag);
        System.out.println("name: "+name);
        System.out.println(likes);
        return  "/success.html";//默认当做内部转发处理  默认当做视图路径
    }
}

2.2.3 页面代码

<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>简单的数据</h1>
<form action="param/simple.do" method="get">
    <p>ID:<input name="id"  /></p>
    <p>boolean:<input name="flag" type="radio" value="true"  /><input name="flag" type="radio" value="false"  /></p>
    <p>String:<input name="name"  /></p>
    <p>city:<input name="City"  /></p>
    <input type="submit" value="提交" />
</form>
<h1>对象的数据</h1>
<form action="param/obj.do" method="get">
    <p>ID:<input name="id"  /></p>
    <p>boolean:<input name="flag" type="radio" value="true"  /><input name="flag" type="radio" value="false"  /></p>
    <p>String:<input name="name"  /></p>
    <input type="submit" value="提交" />
</form>
<h1>map的数据</h1>
<form action="param/map.do" method="get">
    <p>ID:<input name="id"  /></p>
    <p>boolean:<input name="flag" type="radio" value="true"  /><input name=
  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值