SpringMVC

springmvc:是spring中的一个web模块框架。遵循了mvc设计模式的。

MVC的概念:指的是软件的web层设计模式。
	M:Model 模型。 指的是通过Javabean封装数据
	V: View 视图。将Model中的数据进行展示,一般是使用jsp 、html。
	C: Controller 控制器。调用Model的数据给到View展示,或者将View中的数据给到model封装。

springmvc开发流程:

1.导入相关的jar包。除了导入springmvc的jar包之外,还需要导入spring的核心包。
2.创建springmvc的配置文件 dispatcher-servlet.xml.

dispatcher-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:p="http://www.springframework.org/schema/p"
       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">

    <!--扫描包:在springmvc的配置文件中扫描的一般是controller包下带@Controller注解的类
    -->
    <context:component-scan base-package="com.myspringmvc.controller"/>
    <!--配置一个jsp的视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--/success.jsp-->
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

@RequestMapping、springmvc封装的参数、请求的响应数据

/*
* @RequestMapping注解
*   作用: 1. 映射前端的请求,顺据前端的url进行映射,映射之后会把对应的方法执行。
*   使用: 1. 可以用在类上,也可以在方法上
*           1.1在类上使用请求的地址第一一层级先映射到类上, 再根据第一层地址 寻找第二层地址
*           1.2 path属性私value属性写映射的地址
*           1.3 method属性规定映射到这个地址的请求方式必须是怎么样的。GET/POST PUT DELETE
*           1.44. params: params="username"如果是这个格式,要求请求中必须携带这个参数时params !="username"
* springmvc封装的参数
*   1.在对应的方法参数中,传入-个和前端发送的参数名一 样的参数即可拿到。
*   2.把请求参数封装在实体对象中,要求请求的参数必须和该对象的属性名保持一致。
*   3. @RequestParam注解映射参数。
*       3.1 name 属性和vaLue属性都是作用相同的,指定一个前端传递的参数名, 把这个参数赋值
*       3.2 required属性 如果赋值true,要求这个参数在请求的时候必须要携带。
*       3.3 defaultValue 当前端没有给这个参数传值时给一个默认 值。
*   4.传入原生的API获取参数:HttpServletRequest HttpServletResponse
* springmvc请求的响应数据:
*      1.给方法传入map,将响应的数据存入map中springmvc会将这个map存入request域对象中
*      2.给方法传入Model,调用model对象的ddAttribute存入数据,
*      3.给方法传入ModeLMap,调用modeLMap对象的addAttribute存入数据(key-value)
*springmvc中映射请求的处理方法返回值问题:
*   1.返回的是String类型,如果什么注解都不加的情况之下,这个返回值就是响应的地址。
*   2.返回的是void
*        2.1什么值都不响应
*        2.3需要响应一些数据,传入HttpServletResponse通过这个对象,调用输出流,响应到页面
*
 *
 **/

UserController类

package com.myspringmvc.controller;

import com.myspringmvc.pojo.Address;
import com.myspringmvc.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PipedWriter;
import java.io.PrintWriter;
import java.util.Map;


@Controller
@RequestMapping(path = "user"/*,method = RequestMethod.GET,params ="username"*/)
public class UserController {
    //创建一一个方法, 来处理请求
    @RequestMapping(path = "/mvctest")
    public String login(Address address,User user, @RequestParam(name = "sex",required = true,defaultValue = "1")String xingbie){
        System.out.println(user);
        System.out.println(address);
        System.out.println(xingbie);
        //接受参数调用业务层 返回结果
        return "success";//这个返回的结果并非是给到页面的数据,而是响应的页面地址
    }
    //map方式传值
    @RequestMapping(path = "/user1")
    public String test(Map<String,Object> data){
        data.put("name","qiyu");
        data.put("age","19");
        return "success";
    }
    //Model方式传值
    @RequestMapping(path = "/user2")
    public String test1(Map<String,Object> data, Model model){
        data.put("name","qiqi");
        data.put("age","19");
        model.addAttribute("phone","15273835396");
        model.addAttribute(data);
        return "success";
    }
    //ModeLMap方式传值
    @RequestMapping(path = "/user3")
    public String test2(Map<String,Object> data, Model model, ModelMap modelMap){
        data.put("name","qiqi");
        data.put("age","19");
       // model.addAttribute("phone","15273835396");
        model.addAttribute(data);
        modelMap.addAttribute("phone","15273835396");
        System.out.println(data.getClass());
        System.out.println(model.getClass());
        System.out.println(modelMap.getClass());
        return "success";
    }
    @RequestMapping(path = "/user4")
    @ResponseBody//在方法加上这个注解后,方法中响应的数据会直接放在Response对象中响应给浏览器
    // @ResponseBody注解一般搭配异步请求来使用
    public ModelAndView test3(ModelAndView modelAndView){
        //ModeLAndView类的对象封装响应的数据, 并且可以封装响应的视图地址
        modelAndView.setViewName("success");//添加响应地址
        modelAndView.addObject("phone","15273835396");
        return modelAndView;
    }
    @RequestMapping(path = "/user5")
    public void test4(HttpServletResponse response) throws IOException {
        // 如果这个方法在接受到请求之后。只需要处理,处理完之后不需要响应任何的数据或者页面。只需处理请求
        PrintWriter printWriter = response.getWriter();
        //数据存入响应体response对象中,浏览器会直接解析这些数据,放入新创建的页面当中
        printWriter.print("<h1>qiqi</h1>");
        printWriter.print("qiqi");
        System.out.println("调用业务层,不需要返回任何数据");
    }

}

Address 类

package com.myspringmvc.pojo;

public class Address {
    private String provinces;

    public String getProvinces() {
        return provinces;
    }

    public void setProvinces(String provinces) {
        this.provinces = provinces;
    }

    @Override
    public String toString() {
        return "Address{" +
                "provinces='" + provinces + '\'' +
                '}';
    }
}

User类

package com.myspringmvc.pojo;

public class User {
    private  String username;
    private  String phone;
    private String password;
    private  Address address;
    public User() {
    }

    public User(String username, String phone, String password) {
        this.username = username;
        this.phone = phone;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", phone='" + phone + '\'' +
                ", password='" + password + '\'' +
                ", address=" + address +
                '}';
    }
}

inde.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <a href="mvctest">SpringMVC</a><br>
  <a href="user/mvctest?username=zs&phone=15273835396&password=123456&xingbie=男&provinces=湖南">SpringMVC2</a><br>
  <a href="user/user1">SpringMVCUser1</a><br>
  <a href="user/user2">SpringMVCUser2</a><br>
  <a href="user/user3">SpringMVCUser3</a><br>
  <a href="user/user4">SpringMVCUser4</a><br>
  <a href="user/user5">SpringMVCUser5</a><br>
  </body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a>响应成功</a>
    <%
       /* out.print(pageContext.getAttribute("name"));
        out.print(request.getAttribute("name"));
        out.print(session.getAttribute("name"));
        out.print(application.getAttribute("name"));*/

        out.print(pageContext.getAttribute("phone"));
        out.print(request.getAttribute("phone"));
        out.print(session.getAttribute("phone"));
        out.print(application.getAttribute("phone"));
    %>
</body>
</html>