SpringMVC
SpringMVC
搭建项目的顺序:
- 导包
- 配置web.xml
- 配置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
相关注解
- 写在类上面,表示这是一个Servlet,一个bean
- @Component
- @Controller
- @Service
- @Repository
- 用来设置映射的路径,来控制访问时应该输入的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
- 接受前端传过来的参数
- @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改变
拦截器
-
新建一个类实现 HandlerInterceptor 接口
-
重写里面的方法,方法执行前preHandle,执行后postHandle,清理afterCompletion。
,编写对应业务代码 -
在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>
-
-
拦截器就实现了,一般用于认证登录等。
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;
}
}
本文来自博客园,作者:没有烦恼的猫猫,转载请注明原文链接:https://www.cnblogs.com/maomao777/p/16092558.html