SpringMVC

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是MVC?

1.什么是MVC

MVC:

M:Model模型层,指工程中的JavaBean,作用是处理数据
V:View,视图层,指工程中的Html或JSP等页面,作用是与用户进行交互,展示数据
C:Controller,控制层,指工程中的Servlet,作用是接受请求和响应浏览器

JavaBean分两类:

一类称实体类Bean:专门存储业务数据,如Student,User等
一类称业务处理Bean:指Service或Dao对象,专门处理业务逻辑

MVC工作流程:
视图层发送请求到服务器,被Controller接受后,调用Model请求处理;再将结果返回给Controller,Controller再找到View视图,最后响应服务器。

2.HelloWorld

1.配置Web.xml

  • 默认配置方式
  <!--配置 SpringMVC 的前端控制器,对浏览器发送的请求进行统一处理-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <!--
          1、设置 SpringMVC 的核心控制器所能处理的请求的请求路径
          2、/ 所匹配的请求可以是 /login 或 .html 或 .js 或 .css 方式的请求路径,
            但 / 不能匹配 .jsp 请求路径的请求
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  • 扩展配置方式
  <!--配置 SpringMVC 的前端控制器,对浏览器发送的请求进行统一处理-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--通过初始化参数指定 SpringMVC 配置文件的位置和名称-->
        <init-param>
            <!-- contextConfigLocation 为固定值-->
            <param-name>contextConfigLocation</param-name>
            <!--使用 classpath 表示从类路径查找配置文件,例如maven工程中的 src/main/resources -->
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <!--
           服务器启动时就初始化 DispatcherServlet :
           作为框架的核心组件,在启动过程中有大量的初始化操作要做
           而这些操作放在第一次请求时才执行会严重影响访问速度
           因此需要通过此标签将启动控制 DispatcherServlet 的初始化时间提前到服务器启动时
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  1. 配置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="com.example.controller" />

    <!-- 开启注解驱动 -->
    <mvc:annotation-driven />

    <!-- 静态资源处理 -->
    <mvc:resources mapping="/resources/**" location="/resources/" />

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

</beans>
  1. 配置java文件
@Controller
public class HelloController{
	@RequestMapping("\")
	public String indenx(){
		return "index";
		}
}

在这里插入图片描述

二、@RequestMapping

1.用在类上和方法上

用法:地址是类上value+方法上value

@RestController
// 映射到类上
// localhost:8080/user
@RequestMapping("/user")
public class UserController {
		// 映射到方法上
		// localhost:8080/user/login
		// localhost:8080/user/page
		// localhost:8080/user/pageabc    三种均可访问
		// 此处通常用 @GetMapping("/user/login") 表明GET请求方式的映射
    @RequestMapping(value={"/login",
    						"/page",
        					"page*"}) 
    public String login() {
        return "user login";
    }
    
    // 映射到方法上
    // localhost:8080/user/register
    // 此处通常用 @PostMapping("/user/login") 表明POST请求方式的映射
    @RequestMapping("/register")
    public String register() {
        return "user register";
    }
}

以列表的形式存储,相互之间是或的关系,有一个满足就可以

2.method

@RestController
@RequestMapping("/home")
public class IndexController {
    @RequestMapping(method = RequestMethod.GET)
    String get() {
        return "Hello from get";
    }
    @RequestMapping(method = RequestMethod.POST)
    String post() {
        return "Hello from post";
    }
    @RequestMapping(method = {RequestMethod.POST, RequestMethod.GET})
    String method() {
        return "Hello method";
    }
}

相当于@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

3.params

必须要满足的参数

@RestController
@RequestMapping("/home")
public class IndexController {
    @RequestMapping(value = "/fetch", params = {
        "personId=10"
    })
}

相互间是与的关系,要全部满足

4.headers

限制浏览器的头信息

@RestController
@RequestMapping("/home")
public class IndexController {
    @RequestMapping(value = "/head", headers = {
        "content-type=text/plain"
    })
}

三、控制台从浏览器获得值

1. @PathVariable

将浏览器获得值与属性值进行绑定,返回到控制台中

@RequestMapping("/getUserById/{name}")
    public User getUser(@PathVariable("name") String name){
        return userService.selectUser(name);
    }

2.通过ServletAPI获取

通过HttpServletRequest作为控制器方法的形参获取

	@RequestMapping("/testParam")
    public String testParam(HttpServletRequest request) {
    
        String name = request.getParameter("name");
        String age = request.getParameter("age");
		System.out.println("name"+name+"age"+age);
		return "success";
    }

3.通过控制器方法的形参获取请求参数

需要设置和请求参数同名的形参

    @RequestMapping("/param")
    public String getParam(String username,String password,String[] hobby){
        System.out.println("username = " + username+",password = " + password+",hobby"+Arrays.toString(hobby));
        return "success";
    }
}

4. @RequestHeader

用于请求参数和形参不一致的情况

    @RequestMapping("/param")
    public String getParam(@RequestParam(value = "userName", required = true, defaultValue = "hello") String username,
                           @RequestParam("password") String password){
        System.out.println("username = " + username+",password = " + password);
        return "success";
    }
}

5. @RequestHeader和@CookieValue

暂时没有什么用

    @RequestMapping("/param")
    public String getParam(@RequestHeader("referer") String referer,
                           @CookieValue("JSESSIONID") String jsessionId){
        System.out.println("jsessionId = " + jsessionId);
        System.out.println("referer = " + referer);
        return "success";
    }
}

6. 通过实体类获取请求参数

实体类中属性和表单中属性一致即可

User

package demo.bean;
 
public class User {
 
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;
 
    public User() {
    }
 
    public User(Integer id, String username, String password, Integer age, String sex, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
    public String getSex() {
        return sex;
    }
 
    public void setSex(String sex) {
        this.sex = sex;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

ParamController

	@RequestMapping"/testBean")
	public String testBean(User user){
		System.out.println(user);
		return "success";
}

四、向域对象共享数据

三种域对象:

request一次请求
session浏览器开启到浏览器关闭
application服务器开启到服务器关闭

1.使用 servletAPI 向 request 域对象共享数据

@Controller
public class ScopeController {
    @RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request){
        request.setAttribute("testScope", "hello,servletAPI");
        return "success";
    }
}

2.使用 ModelAndView 向 request 域对象共享数据

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
	ModelAndView mav = new ModelAndView();
	mav.addObject("testRequestScope", "Hello ModelAndView");
	mav.setViewName("success");
	return mav;
}

3.使用 Model 向 request 域对象共享数据

@RequestMapping("/testModel")
public String testModel(Model model){
    model.addAttribute("testScope", "hello,Model");
    return "success";
}

4.使用 map 向 request 域对象共享数据

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
    map.put("testScope", "hello,Map");
    return "success";
}

5.使用 ModelMap 向 request 域对象共享数据

@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
    modelMap.addAttribute("testScope", "hello,ModelMap");
    return "success";
}

6.向 session 域共享数据

@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("testSessionScope", "hello,session");
    return "success";
}

7.向 application 域共享数据

@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
 ServletContext application = session.getServletContext();
    application.setAttribute("testApplicationScope", "hello,application");
    return "success";
}

基本上都是.addAttribute,方便记忆;Model、ModelMap、Map有共同的父类

五、视图(略)

1.转发(默认转发)

@RequestMapping("/testForward")
public String testForward(){
    return "forward:/testThymeleafView";
}

2.重定向

@RequestMapping("/testRedirect")
public String testRedirect(){
    return "redirect:/testThymeleafView";
}

3.视图控制器(可以不创建类)

<!--配置SpringMVC的视图控制器-->
<!--path: 设置处理的请求地址		view-name:设置请求地址所对应的视图名称-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--开启SpringMVC的注解驱动(当使用视图控制器后,其他的请求映射将会失效)-->
<mvc:annotation-driven/>

4.jsp

如果没有必要的话,Thymeleaf不建议先学,后面要用的时候再学,jsp建议学一下,因为学校里面要用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>我是首页</h1>
<%--${pageContext.request.contextPath}代表上下文--%>
<a href="${pageContext.request.contextPath}/success">success.jsp</a>
</body>
</html>

六、RESTful

1.RESTful

Resource:资源,即数据(这是网络的核心);
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP的动词(get查询、post新增、put修改、delete删除)实现。

2.资源

添加链接描述

七、报文转换(没看懂)

1.资料

应该就是将返回对象直接显示到浏览器,和从浏览器得到头信息。
添加链接描述

八、拦截器

1.资料

就preHandler有用,返回false拦截,拦截顺序顺逆逆。
添加链接描述

九、异常处理器

1.SpringMVC配置

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props >
            <!--properties的键表示处理器方法执行过程中出现的异常 properties的值表示若出现指定异常时,
            设置一个新的视图名称,跳转到指定页面 -->
                <!--key设置要处理的异常,value设置出现该异常时要跳转的页面所对应的逻辑视图-->
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
        <!--exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享 -->
        <!--设置共享在请求域中的异常信息的属性名-->
        <property name="exceptionAttribute" value="ex"></property>
    </bean>

2.注解配置异常处理器

//@ControllerAdvice将当前类标识为异常处理的组件 
@ControllerAdvice 
public class ExceptionController { 

	//@ExceptionHandler用于设置所标识方法处理的异常 
	@ExceptionHandler(ArithmeticException.class) 
	//ex表示当前请求处理中出现的异常对象 
	public String handleArithmeticException(Exception ex, Model model){ 
		model.addAttribute("ex", ex); 
		return "error"; 
} 
}


总结

只听尚硅谷的课,感觉有点不够用,下次会试试别的课。
笔记

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值