Spring MVC入门

SpringMVC 概述

SpringMVC是基于 MVC(模型层:处理业务,视图层:前端界面,控制层:处理请求和响应) 设计理念的优秀的 Web 框架,是Spring 为展现层提供的,目前最主流的 MVC 框架之一

Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架

Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。

支持 REST 风格的 URL 请求

采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性

SpringMVC项目创建步骤

– 加入 jar 包

– 在 web.xml 中配置 DispatcherServlet

– 加入 Spring MVC 的配置文件

– 编写处理请求的处理器,并标识为处理器

– 编写视图

创建maven项目来管理jar文件
在这里插入图片描述
注意添加根路径再去部署Tomcat
在这里插入图片描述

所需依赖

 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>

在 web.xml 中配置 DispatcherServlet
头部配置可以在Tomcat的conf目录下的web.xml内查找。

<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_4_0.xsd"
         version="4.0">

    <!--springMVC核心前置控制器,用来拦截和处理客户端发送的所有请求-->
    <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>
    </servlet>
    <!--设置路径为/,将所有的请求进行拦截然后分发到各个请求地址-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--通过过滤器设置请求和响应的字符编码-->
    <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>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

在资源文件下配置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
       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="com.entor.controller"/>
    <!--配置默认的servlet处理策略,对静态资源不拦截,例如css、html、js、img等-->
    <mvc:default-servlet-handler/>
    <!--使用注解方式装配请求地址映射类,请求处理适配类-->
    <mvc:annotation-driven/>
    <!--内部资源视图解释器,支持不同的视图层模版引擎-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图文件的路劲地址,/指web的根路径,既项目webapp目录-->
        <property name="prefix" value="/"/>
        <!--视图文件的后缀名称-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

控制层

简单使用

/**
 * 简单使用
 */
@Controller
@RequestMapping("/hello")//该控制层的地址前缀多加一个hello
public class HelloController {

    // @RequestMapping作用:映射请求地址和请求处理的方法,客户端发送/hello请求,由hello()处理
    @RequestMapping("/hello")
    public String hello(){
        //返回值是一个逻辑视图名称,根据视图资源解释器所配置的前缀、后缀、查找对应的视图进行展示
        //此方法返回的hello,查找/路径下的名叫hello.jsp的页面:prefix+返回值+suffix
        return "hello";
    }

    @RequestMapping("/index")
    public String index(){
        return "index";
    }

    /**
     * 请求地址一样,请求方式不一样可以区分为两个请求地址
     *
     */

//    @RequestMapping(value = "/login",method = RequestMethod.GET)
    @GetMapping("/login")//取代上边的注解
    public String login1(){
        return "login1";
    }

//    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @PostMapping(value = "login")//取代上边的注解
    public String login2(){
        return "login2";
    }

    @RequestMapping(value = "/test",produces = "application/json;charset=utf-8")//响应格式为json格式,编码格式为utf-8
    @ResponseBody//把返回值当做响应的主题内容返回给客户
    public String test(){
        return "test 你好";
    }
}

重定向和请求转发


/**
 * 重定向和请求转发
 */
@Controller
public class TestController {

    @RequestMapping(value = "test1")
    public String test1(){
        return "test1";//默认是请求转发到test1.jsp页面
    }

    @RequestMapping(value = "test2")
    public String test2(){
        return "redirect:test1";//重定向到test1请求
    }

    @RequestMapping(value = "test3")
    public String test3(){
        return "redirect:test3.jsp";//重定向到test3.jsp页面
    }

    @RequestMapping(value = "test4")
    public String test4(){
        return "forward:test3";//请求转发到test3请求
    }
}

前后端交互


/**
 * 前后端传值
 */
@Controller
public class UserController {

    @RequestMapping(value = "/getUser")
    public String getUser(Integer id, String name, String password, Map<String, Object> map) {//直接通过形参的名称获取请求的值
        System.out.println("获取到的id:" + id);
        System.out.println("获取到的name:" + name);
        //传递服务器数据给客户端
        map.put("id", id);
        map.put("name", name);
        map.put("password", password);
        //传递对象
        User user = new User(1, "李四", "lisi", "123465");
        map.put("user", user);
        //传递集合
        ArrayList<User> list = new ArrayList<>();
        for (int i = 1; i < 10; i++) {
            user = new User(i, "李四" + i, "lisi" + i, "123465" + i);
            list.add(user);
        }
        map.put("list",list);
        //传递map
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("key1","value1");
        hashMap.put("key2","value2");
        hashMap.put("key3","value3");
        map.put("map",hashMap);
        return "index";
    }

    @RequestMapping("/getUser2")
    //HttpServletRequest直接注入到形参使用,
    //类似的还有HttpServlet Response,HttpSession等待
    public String getUser2(HttpServletRequest request, Model model) {
        System.out.println("获取到的id:" + request.getParameter("id"));
        System.out.println("获取到的name:" + request.getParameter("name"));
        //传递对象
        User user = new User(1, "李四", "lisi", "123465");
        model.addAttribute("user", user);
        //传递集合
        ArrayList<User> list = new ArrayList<>();
        for (int i = 1; i < 10; i++) {
            user = new User(i, "李四" + i, "lisi" + i, "123465" + i);
            list.add(user);
        }
        model.addAttribute("list",list);
        //传递map
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("key1","value1");
        hashMap.put("key2","value2");
        hashMap.put("key3","value3");
        model.addAttribute("map",hashMap);
        return "index";
    }

    //如果客户端传递参数比较多,可以使用对象接收,自动根据参数名称匹配对象属性名赋值
    @RequestMapping("/add")
    public String add(User user,Model model){//将传递的数据自动封装到user
        System.out.println(user);
        model.addAttribute("user",user);
        return "index";
    }

    @RequestMapping("queryById")
    //@RequestParam(value = "id",required = false,defaultValue = "1")
    // value指定前端传递参数的名称
    // required默认为true必须要传值给这个参数否则报错
    // defaultValue 设置这个参数的默认值
    public String queryById(@RequestParam(value = "id",required = false,defaultValue = "1") Integer id){
        return "index";
    }

    //使用restful方式赋值
    //url参数:/getById/1/zhangsan,对应花括号内的值可以指定参数名称,默认参数名称为形参名称,
    @RequestMapping("/getById/{id}/{name}")
    public String getById(@PathVariable("id") Integer id,@PathVariable String name){
        System.out.println(id);
        System.out.println(name);
        return "index";
    }
}

理解:在参数里边的Model model和Map<String, Object> map没有实例化,但是能够通过这两个对象把值传到前端,所以两个值应该写入到了HttpServletResponse对象里边,这两个对象应该写入到了Spring容器,@RequestMapping可能能够把容器内的值注入进来

异步加载


/**
 * jackson-databind结合@RequestMapping注解,返回服务器各种对象类型数据,自动转换成json字符串响应给前端。
 * 处理了中文乱码问题
 */
//@Controller
//@ResponseBody//相当于该类的所有方法都加了这个注解
@RestController//为@Controller+@ResponseBody
@RequestMapping("/student")
public class StudentController {

    @RequestMapping(value = "/test", produces = "application/json;charset=utf-8")
    @ResponseBody
    public String test() {
        return "测试";
    }

    @RequestMapping(value = "/test2", produces = "application/json;charset=utf-8")
    @ResponseBody
    public void test2(HttpServletResponse response) {
        response.setContentType("application/json;charset=utf-8");
        try {
            PrintWriter out = response.getWriter();
            out.write("测试2");
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/getUser")
    @ResponseBody
    public User getUser() {
        User user = new User(1, "李四", "lisi", "123465");
        return user;
    }

    @RequestMapping("/getUsers")
    @ResponseBody
    public List<User> getUsers() {
        User user = null;
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            user = new User(i, "李四" + i, "lisi" + i, "123465" + i);
            list.add(user);
        }
        return list;
    }

    @RequestMapping("/getMap")
    @ResponseBody
    public Map<String,String> getMap() {
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("key1","value1");
        hashMap.put("key2","value2");
        hashMap.put("key3","value3");
        return hashMap;
    }
    @RequestMapping("/login")//提交的url参数格式为$a=1&b=2
    public User login(String username,String password){
        User user = new User(10, "李四", username, password);
        return user;
    }

    //@RequestBody将客户端发送的json数据转换成对应的对象数据
    @RequestMapping("/login1")//提交的url参数格式为json字符串
    public User login1(@RequestBody User user){
        user.setId(1);
        user.setName("张三");
        return user;
    }

}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="static/js/jquery-1.7.2.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">

        function login() {
            var username = $("input[name=username]").val();
            var password = $("input[name=password]").val();
            var data = {"username":username,"password":password};
            var jstr = JSON.stringify(data);
            $(function () {
                $.ajax({
                    type: "post",
                    url: "student/login1",
                    data: jstr,
                    dataType: "json",
                    contentType:"application/json",<!--告知服务器我提交的参数是一个json字符串-->
                    success: function (result) {
                        $("#id").html(result.id);
                        $("#name").html(result.name);
                        $("#username").html(result.username);
                        $("#password").html(result.password);
                    }
                })
            });
        }
    </script>
</head>
<body>
<form>
    <input type="text" name="username"><br>
    <input type="passsword" name="password"><br>
    <input id="login_btn" type="button" value="登录" onclick="login()"><br>
</form>
服务器返回的数据:<br/>
<span id="id"></span><br/>
<span id="name"></span><br/>
<span id="username"></span><br/>
<span id="password"></span><br/>

</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值