SpringMVC

SpringMVC

搭建项目的顺序:

  1. 导包
  2. 配置web.xml
  3. 配置spring-mvc.xml

相关配置和依赖-------------------------------------------------------

Maven依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

    </dependencies>

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 
 	
<!--  	servletConfig 读取当前servlet里面的init-param -->

<!--  	setvletContext 读取web.xml配置的context-param -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<!-- spring里面的配置文件 -->
			<!--<param-value>classpath:applicationContext.xml</param-value> -->
			<!-- springMVC里面的spring-mvc.xml配置文件 -->
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<!-- 指定servlet启动的优先级。1-5,越小优先级就越高 将Servlet的启动提前至服务器启动前 -->
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- 在SpringMVC中,	‘/’ 和 ‘/*’ 的区别
	/:只匹配所有的请求,不会去匹配jsp	一般写‘/’就可以了
	/*:匹配所有的请求,包括jsp
	-->	
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<!-- "/"  表示当前项目下面所有的静态资源(css,js, html,image,properties,xml),但servlet除外 -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<!-- <servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping> -->
	
	<!-- 解决提交乱码问题 -->
	<filter>  
        <filter-name>characterEncodingFilter</filter-name>  
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
        <init-param>  
            <param-name>encoding</param-name>  
            <param-value>utf8</param-value>  
        </init-param>  
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param>  
 	</filter>  
	<filter-mapping>  
        <filter-name>characterEncodingFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
 	</filter-mapping>
</web-app>

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

	<context:component-scan base-package="*.*"></context:component-scan>
	
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
		<!-- 配置数据源 -->
	<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
		<property name="driverClassName" value="${driver}"></property>
		<property name="url" value="${url}"></property>
		<property name="username" value="${user}"></property>
		<property name="password" value="${password}"></property>
	</bean>
	
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>	
	
	
	<mvc:annotation-driven />
	
</beans>

jdbc.properties文件配置,连接数据库所需

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springmvc?useUnicode=true&characterEncoding=utf8
user=root
password=258025

相关注解

  1. 写在类上面,表示这是一个Servlet,一个bean
    • @Component
    • @Controller
    • @Service
    • @Repository
  2. 用来设置映射的路径,来控制访问时应该输入的URL,前提是在spring-mvc.xml中配置好视图解析器
    • @RequestMapping("/xx") 可以写在类上也可以写到方法上,当写在类上时,访问下面的Servlet就要先通过类上的映射路径后再加上方法上的映射路径
    • @PostMapping("")
    • @GetMapping("")
    • @ResponseBody //他就不会走视图解析器,会直接返回一个字符串
    • @ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。
      注意:在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
      ————————————————
      版权声明:本文为CSDN博主「originations」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/originations/article/details/89492884
  3. 接受前端传过来的参数
    • @RequestParam("name") String name
    • 在不写该注解的时候,方法的参数名要跟实体类中的属性数据类型相同,不然会报错
    • 推荐都写这个注解,可以方便看出这是用来接收前端请求的参数,并且建议名字相同
    • 如果接收的是个对象,例如User,就直接 User user 即可

RestFul风格

就是我们一般在访问url时候传入参数,要使用 xx/?id=xx&name=xx
但是使用RestFul风格,在url上传递参数只需要使用斜杠即可,但是在方法上的参数需要使用@PathVariable int a
注解并限制参数类型

例如

@RequestMapping("/t1/{a}/{b}") 
public String test1(@PathVariable int a,@PathVariable String b,Model model){
	String res = a + b;
	mode1.addAttribute("msg" ,"结果为"+res);
    return "test" ;
}

在Controller中调用对应的视图

我们首先需要在spring-mvc.xml中配置好视图解析器的相关配置。(前提,这是在springmvc下的转发和重定向)
在方法中 我们可以使用以下几种对象来返回数据给前端

  • Model 用来存放数据常用
  • ModelAndView 可以存放数据并调用对应的逻辑视图
  • ModelMap 理解就行

重定向跟转发,forword 和 redirect
默认都是转发,直接return文件名就可以了,url不改变
重定向只需要再返回的时候加上 :redirect/test.jsp 就可以,(重定向不走视图解析器?自己还未考证),url改变

拦截器

  1. 新建一个类实现 HandlerInterceptor 接口

  2. 重写里面的方法,方法执行前preHandle,执行后postHandle,清理afterCompletion。
    ,编写对应业务代码

  3. 在springmvc配置文件中配置拦截器

    • <!--关于拦截器的配置-->
      <mvc:interceptors>
         <mvc:interceptor>
             <!--/** 包括路径及其子路径-->
             <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
             <!--/admin/** 拦截的是/admin/下的所有-->
             <mvc:mapping path="/**"/>
             <!--bean配置的就是拦截器-->
             <bean id="myInterceptor" class="com.kuang.interceptor.MyInterceptor"/>
         </mvc:interceptor>
      </mvc:interceptors>
      
  4. 拦截器就实现了,一般用于认证登录等。

JSON

键值对 例如

const user = {name:"毛毛",age:20,sex:"男"}
// 将js对象转换为json对象
let json = JSON.stringify(user);
console.log(json);
//{name:"毛毛",age:20,sex:"男"}
//将json对象转换为JavaScript对象
let obj = JSON.parse(json);
console.log(obj);
@RequestMapping("/j1")
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
public string json1() throws JsonProcessingException {
	//jackson. ObjectMapper
	ObjectMapper mapper = new ObjectMapper();
	//创建一个对象	name: "秦疆1号",age: 3, sex:"男"
	User user = new User("秦疆1号",3,"男");
    String str = mapper.writeValueAsString(user);
	return str;
}

返回json字符串统一解决

在类上直接使用 @RestController ,这样子,里面所有的方法都只会返回 json 字符串了,不用再每一个都添加@ResponseBody !我们在前后端分离开发中,一般都使用 @RestController ,十分便捷!

@RestController
public class UserController {

   //produces:指定响应体返回类型和编码
   @RequestMapping(value = "/json1")
   public String json1() throws JsonProcessingException {
       //创建一个jackson的对象映射器,用来解析数据
       ObjectMapper mapper = new ObjectMapper();
       //创建一个对象
       User user = new User("秦疆1号", 3, "男");
       //将我们的对象解析成为json格式
       String str = mapper.writeValueAsString(user);
       //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
       return str;
  }

}
posted @ 2022-04-02 16:03  没有烦恼的猫猫  阅读(21)  评论(0编辑  收藏  举报