0、搭建SpringMVC的环境
0.1、在pom.xml中添加需要的依赖以及过滤信息
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<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>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
0.2、创建连接数据库所需要的文件
- 连接数据库所需的信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
username=username
password=123456
- 将信息添加到spring-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描db.properties中的数据-->
<context:property-placeholder location="classpath:db.properties"/>
<!--创建dataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<!--创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="org.westos.pojo"/>
<!--<property name="mapperLocations" value="classpath:org/westos/dao/*.xml"/>-->
</bean>
<!--自动给接口创建sqlSession-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="org.westos.dao"/>
</bean>
</beans>
0.3、创建springmvc的配置文件
- spring-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: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
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="org.westos.controller"/>
<!--开启注解-->
<mvc:annotation-driven/>
<!--处理静态资源-->
<mvc:default-servlet-handler/>
<!--配置视图资源解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/JSP/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 在web.xml中添加DispatcherServlet以及过滤信息
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</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>
0.4、创建service层的文件
<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"
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">
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
0.5、创建applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-servlet.xml"/>
</beans>
至此,环境搭建完成
1、JSON
1.1、什么是JSON?
- JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
- 对象表示为键值对,数据由逗号分隔
- 花括号用来存储对象,方括号用来存储数组
1.2、在SpringMVC中使用JSON
- 使用JSON要先引入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
- 在controller层创建一个测试类
@RestController
public class JsonController {
@RequestMapping("/t1")
public String test1(){
//将字符串以键值对的方式返回到前端页面
return "{\"name\":\"黄\",\"age\":\"20\",\"sex\":\"男\"}";
}
}
- 测试结果:
1.3、解决JSON传递中文字符串发生乱码的问题
- 在RequestMapping中添加信息,显然这种方法只适用于单个的情况,多个方法不适用
@RestController
public class JsonController {
@RequestMapping(value = "/t1",produces = "application/json;charset=utf-8")
public String test1(){
//将字符串以键值对的方式返回到前端页面
return "{\"name\":\"黄\",\"age\":\"20\",\"sex\":\"男\"}";
}
}
- 多个方法返回json数据时,可以在spring-servlet.xml文件中添加乱码信息
<!--配置json的乱码问题-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
- 使用json返回一个对象
@RequestMapping("/t2")
public User test2(){
User user = new User(20, "Henry", "男");
return user;
}
- 使用json返回一个对象集合
@RequestMapping("/t3")
public List<User> test3(){
User user1 = new User(20,"Henry", "男");
User user2 = new User(20, "Henry", "男");
User user3 = new User(20,"Henry", "男");
User user4 = new User(20,"Henry", "男");
ArrayList<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
return list;
}
- RequestMapping注解具有把数据自动以json格式返回的功能
2、Ajax
2.1、什么是Ajax?
- Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,**无需重新加载整个网页的情况下,能够更新部分网页的技术。**通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。
2.2、创建一个html网页测试Ajax
- 使用jQuery导入ajax
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
百度:<input type="text" name="name" id="baidu" onblur="baidu()">
<script>
function baidu() {
//鼠标失去焦点的时候调用baidu()
//$代表jQuery,post()代表发送一个请求
$.post({
url:'a1',
data:{name:$("baidu").var},
//成功的时候调用success方法
success:function (data,status) {
console.log(data)
console.log(status)
}
})
}
</script>
</body>
</html>
- 创建AjaxController测试类
@RestController
public class AjaxController {
@RequestMapping("/a1")
public String test1(){
return "ok";
}
}
- 测试
2.3、使用ajax返回对象集合
- 常见测试类
@RequestMapping("/a2")
public List<User> ajax2(){
//把对象放在数组中
List<User> users = new ArrayList<User>();
users.add(new User(20,"Henry", "男"););
users.add(new User(18,"Henry", "男"););
users.add(new User(16,"Henry", "男"););
return users;
}
- 创建前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<input type="button" id="btn" value="获取数据"/>
<table width="80%" align="center">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
</tr>
<tbody id="content">
</tbody>
</table>
<script>
$(function () {
$("#btn").click(function () {
$.post("/a2",function (data) {
console.log(data)
var html="";
for (var i = 0; i <data.length ; i++) {
html+= "<tr>" +
"<td>" + data[i].name + "</td>" +
"<td>" + data[i].age + "</td>" +
"<td>" + data[i].sex + "</td>" +
"</tr>"
}
$("#content").html(html);
});
})
})
</script>
</body>
</html>
- 测试
3、拦截器
- 要想使用拦截器,只需实现HandlerInterceptor接口即可
- 在spring-servlet.xml中添加拦截器的信息
<!--关于拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路径及其子路径-->
<!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
<!--/admin/** 拦截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<!--bean配置的就是拦截器-->
<bean class="org.westos.controller.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3.1、使用拦截器模拟登陆
- 创建一个LoginController类
@Controller
@RequestMapping("/user")
public class LoginController {
//跳转到login.jsp页面
@RequestMapping("/jumpLogin")
public String jumpLogin(){
return "login";
}
//不登陆直接跳转到success.jsp页面,为拦截器做铺垫
@RequestMapping("/jumpSuc")
public String jumpSuc(){
return "success";
}
@RequestMapping("/login")
public String login(String username, String password, HttpSession session){
//在session中添加信息
session.setAttribute("user",username);
//登陆成功,跳转到success.jsp页面
return "success";
}
@RequestMapping("/logout")
public String logout(HttpSession session){
//注销,即清空session中的信息
session.invalidate();
//清空后,跳转到login.jsp
return "login";
}
}
- 创建一个登陆页面login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--提交数据要使用表单--%>
<form action="/user/login" method="get">
用户名: <input type="text" name="username"/> <br>
密码: <input type="password" name="password"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
- 创建登陆成功的页面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>
登陆成功
</h1>
${user}
<%--设置一个超链接,用来注销--%>
<a href="/user/logout">注销</a>
</body>
</html>
- 创建拦截器
public class LoginIntercptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果是登陆页面也放行
if (request.getRequestURI().contains("login")){
return true;
}
//如果session中user不为空,则不拦截
HttpSession session = request.getSession();
if (session.getAttribute("user")!=null){
return true;
}
//用户没有登陆之前,给跳转到登陆页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false; //false代表拦截
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
- 在springmvc-servlet.xml中注册拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="loginInterceptor" class="org.westos.intercptor.LoginIntercptor"/>
</mvc:interceptor>
</mvc:interceptors>