SprngMVC-AJAX-PostgreSQL-cmcG
- 目录
- 该工程的下载地址...
- 文件目录截图
- pom.xml文件内容
- web.xml文件内容
- jdbc.properties文件内容
- spring-dao.xml文件内容
- spring-mvc.xml文件内容
- mybatis-config.xml文件内容(这个可以不写,效果是一样的,已测试)
- generatorConfig.xml文件内容
- IUserService.java文件内容
- BaseController.java文件内容
- UserServiceImpl.java文件内容
- UserController.java文件内容
- ResponseResult.java文件内容(完整版)
- ServiceException.java文件内容
- UserNotFoundException.java文件内容
- InsertIntoException.java文件内容
- log4j.properties文件内容
- findByUid.html文件内容
- addUser.html文件内容
- reg.html文件内容
- SpringMVC里的拦截器配置
- EL表达式
- JSTL
- 一个Servlet类
- jquery-1.9.1.min.js文件内容
- MD5密码加密
- 事务
- 业务异常基类
- SpringBoot里面的拦截器类
- SpringBoot里的接口扫描配置
- js里的md5算法代码
- JSP文件基础代码
- AJAX
目录
该工程的下载地址…
文件目录截图
pom.xml文件内容
<dependencies>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!--spring 事务包 jdbc,tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- JSON转换 -->
<!-- <dependency> -->
<!-- <groupId>com.fasterxml.jackson.core</groupId> -->
<!-- <artifactId>jackson-annotations</artifactId> -->
<!-- <version>2.9.8</version> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>com.fasterxml.jackson.core</groupId> -->
<!-- <artifactId>jackson-core</artifactId> -->
<!-- <version>2.9.8</version> -->
<!-- </dependency> -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<!--spring的整合测试包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.8.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- springmvc的文件上传 -->
<!-- <dependency> -->
<!-- <groupId>commons-fileupload</groupId> -->
<!-- <artifactId>commons-fileupload</artifactId> -->
<!-- <version>1.4</version> -->
<!-- </dependency> -->
<!-- 注解包 -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- 注解包 -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.6</version>
</dependency>
<!--cocommons-lang3 帮助包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--mybatis-spring整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!--spring 基础包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!-- 事务处理包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
web.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>ssm_postgresql</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 加载log4j的配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<!-- log4j的监听配置 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- 加载Spring容器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 设置Spring容器加载所有的配置文件的路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-dao.xml</param-value>
</context-param>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<filter>
<display-name>CharacterEncodingFilter</display-name>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
jdbc.properties文件内容
MySql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/cgm?useUnicode=true&characterEncoding=UTF-8
username=root
password=root
initialSize=3
maxActive=5
PostgreSQl
driver=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/postgres?charSet=utf-8
username=postgres
password=postgres
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:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 配置数据连接信息 -->
<util:properties id="jdbc" location="classpath:config/jdbc.properties"></util:properties>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="#{jdbc.driver}" />
<property name="url" value="#{jdbc.url}" />
<property name="username" value="#{jdbc.username}" />
<property name="password" value="#{jdbc.password}" />
<!-- <property name="initialSize" value="#{jdbc.initialSize}" /> -->
<!-- <property name="maxActive" value="#{jdbc.maxActive}" /> -->
</bean>
<!-- 扫描Mapper类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cmc.dao" />
</bean>
<!-- 扫描mapper.xml文件 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 如果mapper.xml文件不在cmc.dao包下,则可以使用下面的方法自定义路径 -->
<!-- <property name="mapperLocations" value="classpath:mappers/*.xml" /> -->
</bean>
<!-- 事务管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事务注解,标注@Transactional的类和方法将具有事务性 -->
<tx:annotation-driven transaction-manager="txManager" />
<!-- spring-mvc的注解扫描器不会添加事务,这里再次扫描就覆盖为有事务的注解,最好分开单独扫描 -->
<context:component-scan base-package="cmc.service.impl" />
</beans>
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/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
">
<!-- 扫描控制器类 -->
<context:component-scan base-package="cmc.controller"></context:component-scan>
<!-- 注解驱动: 如: 通知HandlerMapping,处理 RequestMapping注解 -->
<mvc:annotation-driven />
<!-- 视图处理器 当控制器返回视图名称时候,利用视图解析器拼接前后缀,找到视图对象 如: 控制器返回view时,拼接前后缀以后为: /WEB-INF/jsp/view.jsp -->
<bean id=""
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value=""></property>
<property name="suffix" value=".html"></property>
</bean>
<!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd -->
<mvc:resources mapping="/img/**" location="/img/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/jq/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/html/**" location="/html/" />
</beans>
mybatis-config.xml文件内容(这个可以不写,效果是一样的,已测试)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="User" type="cmc.entity.User"/>
</typeAliases>
<mappers>
<mapper resource="com/mapper/UserMapper.xml" />
</mappers>
</configuration>
generatorConfig.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 引入外部数据库配置文件:通过el表达式进行读取 -->
<properties resource="config/jdbc.properties" />
<!-- 指定数据连接驱动jar地址 -->
<!-- <classPathEntry location="${classPath}" /> -->
<!-- MyBatis3Simple:生成简单版的MyBatis3 -->
<context id="context1" targetRuntime="MyBatis3Simple">
<commentGenerator>
<!-- 关闭自动生成的注释 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="${driver}"
connectionURL="${url}" userId="${username}"
password="${password}" />
<!-- 生成模型的包名和位置 -->
<javaModelGenerator targetPackage="cmc.entity"
targetProject="ssm_postgresql" />
<!-- 生成DAO的包名和位置 -->
<sqlMapGenerator targetPackage="cmc.dao"
targetProject="ssm_postgresql" />
<!-- 生成映射文件的包名和位置:如果不想写在cmc.dao文件夹里面,则:targetProject="ssm_postgresql/src/main/resources" -->
<javaClientGenerator targetPackage="cmc.dao"
targetProject="ssm_postgresql" type="XMLMAPPER" />
<!-- 要生成哪些表 -->
<table tableName="t_user" domainObjectName="User">
<!--字段名称使用骆驼命名方式:dept_no 变为deptNo -->
<property name="useActualColumnNames" value="false" />
</table>
</context>
</generatorConfiguration>
IUserService.java文件内容
package cmc.service;
import cmc.entity.User;
import cmc.service.ex.InsertIntoException;
import cmc.service.ex.UserNotFoundException;
public interface IUserService {
User getUserByUid(int uid) throws UserNotFoundException;
void add(User user) throws InsertIntoException;
}
BaseController.java文件内容
package cmc.controller;
import java.io.Serializable;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ExceptionHandler;
import cmc.service.ex.InsertIntoException;
import cmc.service.ex.ServiceException;
import cmc.service.ex.UserNotFoundException;
import cmc.util.ResponseResult;
/**
* 控制器类的基类(这里要写成public访问权限)
*/
public abstract class BaseController implements Serializable{
private static final long serialVersionUID = 1840322426068577897L;
private static Logger logger = Logger.getLogger(BaseController.class);//获取log实例
public static final Integer SUCCESS = 200; // 为什么设置为静态: 只需要这个属性只加载一次
@ExceptionHandler(ServiceException.class) // 如果不加参数就会处理所有的异常(作用域: 当前类和派生类)
public ResponseResult<Void> handleException(Throwable e){ // 这里的类型要大于等于上面参数的类型范围
ResponseResult<Void> rr = new ResponseResult<Void>();
rr.setMessage(e.getMessage());//给返回值设置错误信息
if(e instanceof UserNotFoundException) {
// 401-用户不存在异常
rr.setState(401);
}
else if(e instanceof InsertIntoException) {
// 402-数据库异常
rr.setState(402);
}
logger.error(rr);
return rr;
}
}
UserServiceImpl.java文件内容
package cmc.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cmc.dao.UserMapper;
import cmc.entity.User;
import cmc.service.IUserService;
import cmc.service.ex.InsertIntoException;
import cmc.service.ex.UserNotFoundException;
@Service
public class UserServiceImpl implements IUserService{
@Resource UserMapper userMapper;//自动注入
public User getUserByUid(int uid) throws UserNotFoundException{
User user = userMapper.selectByPrimaryKey(uid);
System.out.println("uid:"+uid);
System.out.println("user:"+user);
if(user==null) {
throw new UserNotFoundException("用户不存在!");
}
return user;
}
@Transactional//事务处理
public void add(User user) throws InsertIntoException{
int result = userMapper.insert(user);
if (result!=1) {
throw new InsertIntoException("用户插入失败!");
}
}
}
UserController.java文件内容
package cmc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cmc.entity.User;
import cmc.service.IUserService;
import cmc.service.ex.InsertIntoException;
import cmc.service.ex.UserNotFoundException;
import cmc.util.ResponseResult;
@RestController//相当于为所有方法加上@ResponseBody注解:响应正文,返回的内容(其内容类型是json类型,json框架会自动将这个返回值转换为json对象,没有设置属性的值则属性值为null)加在响应正文里面
@RequestMapping("/user")
public class UserController extends BaseController{
private static final long serialVersionUID = 868909085141359691L;
@Autowired IUserService userService;
@PostMapping("/find.do")
// @ResponseBody
public ResponseResult<User> reg(int uid) throws UserNotFoundException{
User user = userService.getUserByUid(uid);
return new ResponseResult<User>(200, user);
}
@PostMapping("/add.do")
public ResponseResult<Void> add(User user)throws InsertIntoException{
userService.add(user);
return new ResponseResult<>(200);
}
}
ResponseResult.java文件内容(完整版)
package cn.cm.store.util;
import java.io.Serializable;
/**
* 用于向客户端响应操作结果的类型
* @param <T> 操作结果中包含的数据的类型
*/
public class ResponseResult<T> implements Serializable{
private static final long serialVersionUID = 4374605395569073306L;
private Integer state;
private String message;
private T data;
public ResponseResult() {
super();
}
public ResponseResult(Integer state, String message) {
super();
this.state = state;
this.message = message;
}
public ResponseResult(Integer state) {
super();
this.state = state;
}
public ResponseResult(Integer state, T data) {
super();
this.state = state;
this.data = data;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "ResponseResult [state=" + state + ", message=" + message + ", data=" + data + "]";
}
}
ServiceException.java文件内容
package cmc.service.ex;
/**
* 业务异常,是当前项目中业务层抛出的异常的基类
*/
public abstract class ServiceException extends RuntimeException {
private static final long serialVersionUID = -1792166260058425842L;
public ServiceException() {
super();
}
public ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
}
UserNotFoundException.java文件内容
package cmc.service.ex;
public class UserNotFoundException extends ServiceException {
private static final long serialVersionUID = -5565667090353918473L;
public UserNotFoundException() {
super();
// TODO Auto-generated constructor stub
}
public UserNotFoundException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
public UserNotFoundException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public UserNotFoundException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public UserNotFoundException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
InsertIntoException.java文件内容
package cmc.service.ex;
public class InsertIntoException extends ServiceException {
private static final long serialVersionUID = 3796981299409293958L;
public InsertIntoException() {
super();
// TODO Auto-generated constructor stub
}
public InsertIntoException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
public InsertIntoException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public InsertIntoException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public InsertIntoException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
log4j.properties文件内容
# Global logging configuration
log4j.rootLogger=ERROR, stdout,file
# MyBatis logging configuration...
log4j.logger.cmc=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] %c{1}:%L - %m%n
# To File
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=F:/logs/ssm_postgresql/INFO.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %5p %c{1}:%L - %m%n
findByUid.html文件内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>根据UID查询用户信息</title>
</head>
<body>
<form action="find.do" method="post">
输出UID:<input type="text" name="uid"><hr>
<input type="submit" value="查询">
</form>
</body>
</html>
addUser.html文件内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加用户</title>
</head>
<body>
<form action="add.do" method="post">
输入UID :<input type="text" name="uid"><hr>
输入用户名:<input type="text" name="username"><hr>
输入密码 :<input type="text" name="password"><hr>
<input type="submit" value="添加">
</form>
</body>
</html>
reg.html文件内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
<script type="text/javascript" src="../jq/jquery-1.9.1.min.js"></script>
</head>
<body onkeydown="key()">
<h1>用户注册</h1>
<form method="post" action="reg.do">
<div>请输入用户名</div>
<div><input id="username" name="username">
<span id="uname-exist"></span>
</div>
<div>请输入密码</div>
<div><input name="password"></div>
<div>请输入年龄</div>
<div><input name="age"></div>
<div>请输入电话</div>
<div><input name="phone"></div>
<div>请输入邮箱</div>
<div><input name="email"></div>
<div><input id="btn-reg" type="submit" value="注册>>"></div>
</form>
<script type="text/javascript">
function key(){
if (event.keyCode==13)$("#btn-reg").trigger("click");
}
$("#btn-reg").click(function(){
// 发出异步请求,并处理结果
// url:将请求提交到哪里去
// data:提交的请求参数,例如:username=root&password=111
// dataType:响应数据的类型,取值可以是,"json","",例如服务器响应的可能是application-json
// success:当服务器成功响应时(如Http响应码是2xx时)的回调函数(成功响应时再执行)
$("#uname-exist").html("");
$.ajax({
"url":"reg.do",
"data":"username="+$("#username").val(),
"type":"post",
"dataType":"json",
"success":function(json){ <!-- 这个json可以随便取名字 -->
if(json.state==200){<!-- 如果json的state的状态码为200 -->
location.href="logSuccess.html";<!-- 转到登录成功界面 -->
}else{
$("#uname-exist").html(json.message);<!-- 输出错误信息 -->
}
}
});
});
</script>
</body>
</html>
SpringMVC里的拦截器配置
LoginInterceptor登录拦截器类
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler)throws Exception {
System.out.println("LoginInterceptor.preHandle()");
return false;}
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler,ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor.postHandle()");}
public void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex)throws Exception {
System.out.println("LoginInterceptor.afterCompletion()");}}
Spring-mvc.xml里进行配置
<!-- 拦截器链 -->
<mvc:interceptors>
<!-- 第1个拦截器 -->
<mvc:interceptor>
<!-- 1. 拦截路径(黑名单) -->
<mvc:mapping path="/main/*"/>
<mvc:mapping path="/news/*"/>
<mvc:mapping path="/user/*"/>
<!-- 2. 例外(白名单) -->
<mvc:exclude-mapping path="/user/reg.do"/>
<mvc:exclude-mapping path="/user/handle_reg.do"/>
<mvc:exclude-mapping path="/user/login.do"/>
<mvc:exclude-mapping path="/user/handle_login.do"/>
<!-- 3. 拦截器类 -->
<bean class="cn.tedu.spring.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<!-- 注: 在拦截器的`preHandle()`方法运行时,返回`false`表示**拦截**,返回`true`表示**放行**,并且,`postHandle
()`和`afterCompletion()`方法都是在`preHandle()`之后的,且仅当**放行**时执行。 -->
<!--注: 在配置拦截器的拦截路径或例外路径时,可以使用通配符:
`*`表示某"一层"路径或某个资源,例如`/user/*`可以通配`/user/reg.do`及`/user/login.do`等
`?`可以通配1个字符
`**`可以通配"多层"级内容,例如`/user/**`可以通配`/user/1/edit`及`/user/1/delete`等.-->
EL表达式
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>EL表达式显示数据</h1>
<p>${num}</p>
<p>${arr[1]}</p>
<p>${list[1]}</p>
<p>${map.name},${map['age']}</p>
<p>${user.uname},${user['pwd']}</p>
<p>${users[0].uname},${users[0].pwd}</p>
<p>${users[1].uname},${users[1].pwd}</p>
<p>${users[2].uname},${users[2].pwd}</p>
</body>
</html>
JSTL
list.jsp
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
我是users:<p>${requestScope.users }</p>
<h1>JSTL 迭代标签</h1>
<ul>
<c:forEach items="${users}" var="user"><!-- user代表users里面的每个对象 -->
<li>
${user.uname},${user.age},
<c:choose>
<c:when test="${user.age<15}">${user.uname }是小孩</c:when>
<c:when test="${user.age<25}">${user.uname }是小伙</c:when>
<c:otherwise>${user.uname }爷们</c:otherwise>
</c:choose>
</li>
</c:forEach>
</ul>
<h2>格式标签</h2>
<!-- format:格式化 Number: 数字
566023.4444 -> RMB566,023.44
只可以RMB和其他的钱币表示字母,并且会一直存在最前面 #占位符:没有数字就不显示 00:没有数字加00,有数字4舍5入替换为数字,有几个0显示几个小数 -->
<p>跳楼价:<fmt:formatNumber value="${price }" pattern="RMB###,###,###.00"/>
</p>
<!-- 格式化日期 -->
<p>仅限今日:<fmt:formatDate value="${today}" pattern="yyyy-MM-dd"/>
</p>
</body>
</html>
一个Servlet类
package web;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.User;
public class ForEachServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<User> list = new ArrayList<User>();
list.add(new User("Tom",12));
list.add(new User("Bob",50));
list.add(new User("Coi",20));
list.add(new User("Jon",56));
list.add(new User("Sendy",40));
list.add(new User("Carry",77));
request.setAttribute("users", list);
request.setAttribute("price", 345.7);
Date date = new Date();
System.out.println(date);
request.setAttribute("today", date);
request.getRequestDispatcher("list.jsp").forward(request, response);
}
}
Servlet需要在web.xml文件里面配置
<servlet>
<description></description>
<display-name>ForEachServlet</display-name>
<servlet-name>ForEachServlet</servlet-name>
<servlet-class>web.ForEachServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForEachServlet</servlet-name>
<url-pattern>/for</url-pattern>
</servlet-mapping>
jquery-1.9.1.min.js文件内容
[link]另外一篇文章
MD5密码加密
//生成随机盐值
// 执行密码加密,得到加密后的密码
// 将盐和加密后的密码封装到user中
String salt = UUID.randomUUID().toString();
String md5Password = getMd5Password(user.getPassword(), salt);
user.setSalt(salt);
/**
* 获取执行MD5加密后的密码
* @param password 原密码
* @param salt 盐值
* @return 加密后的密码
*/
private String getMd5Password(String password,String salt) {
String result = salt+password+salt;
for(int i=0;i<5;i++) {
result = DigestUtils.md5DigestAsHex(result.getBytes()).toUpperCase();
}
return result;
}
事务
\\加在方法上面(测试),加在类上面是可以的
@Transactional
业务异常基类
package cn.cm.store.service.ex;
/**
* 业务异常,是当前项目中业务层抛出的异常的基类
*/
public abstract class ServiceException extends RuntimeException {
private static final long serialVersionUID = -1792166260058425842L;
public ServiceException() {
super();
}
public ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(String message) {
super(message);
}
public ServiceException(Throwable cause) {
super(cause);
}
}
SpringBoot里面的拦截器类
package cn.cm.store;
import cn.cm.store.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration //注: 加这个注解SpringBoot会在启动时加载这个类(即: 才会添加这里注册的拦截器)
public class LoginInterceptorConfigurer implements WebMvcConfigurer {
/**
* 添加多个拦截器
*/
public void addInterceptors(InterceptorRegistry registry) {
//拦截路径(黑名单)
List<String> patterns = new ArrayList<String>();
patterns.add("/**");
//放行路径(白名单)
List<String> excludePatterns = new ArrayList<String>();
excludePatterns.add("/web/login.html");
excludePatterns.add("/user/login");
excludePatterns.add("/web/register.html");
excludePatterns.add("/user/reg");
excludePatterns.add("/web/index.html");
excludePatterns.add("/web/product.html");
excludePatterns.add("/districts/**");
excludePatterns.add("/goods/**");
// cs文件
excludePatterns.add("/bootstrap3/**");
excludePatterns.add("/css/**");
excludePatterns.add("/images/**");
excludePatterns.add("/js/**");
//注册拦截器
registry.addInterceptor(new LoginInterceptor()).addPathPatterns().excludePathPatterns(excludePatterns);
}
}
SpringBoot里的接口扫描配置
package cn.cm.store;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;
import javax.servlet.MultipartConfigElement;
// 自带的注解
@SpringBootApplication
// SpringBoot启动时会加载这些配置
@Configuration
// 扫描mapper接口文件
@MapperScan("cn.cm.store.mapper")
//@EnableCaching
public class StoreApplication{
public static void main(String[] args) {
SpringApplication.run(StoreApplication.class, args);
}
// 视图处理器
// @Bean
// public ViewResolver getViewResolver() {
// InternalResourceViewResolver resolver = new InternalResourceViewResolver();
// resolver.setPrefix("/web/");
// resolver.setSuffix(".html");
// return resolver;
// }
// 设置文件传输大小
@Bean
public MultipartConfigElement multipartConfigration() {
MultipartConfigFactory mcf
= new MultipartConfigFactory();
DataSize maxFileSize = DataSize.ofBytes(100 * 1024 * 1024); // 100兆
DataSize maxRequestSize = DataSize.ofBytes(100 * 1024 * 1024);
mcf.setMaxFileSize(maxFileSize);
mcf.setMaxRequestSize(maxRequestSize);
MultipartConfigElement mce
= mcf.createMultipartConfig();
return mce;
}
//# FileMaxSize(application.properties配置文件中添加以下配置也可以设置文件传输大小)
//spring.servlet.multipart.maxFileSize=30MB
//spring.servlet.multipart.maxRequestSize=30MB
}
js里的md5算法代码
[link]另外一篇文章
JSP文件基础代码
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%> <!-- 这是设置时间的包 -->
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
</body>
</html>
AJAX
/* AJAX*/
$("#btn-changeInfo").click(function(){
$.ajax({
"url":"/user/changeInfo",
"data":$("#form-changeInfo").serialize(),
"type":"POST",
"dataType":"json",
"success":function(json) { //注: 这里的json名字可以随便取,这里的值是服务器方法的返回值由框架
alert(json.message); // 自动变成的json对象,其实就是子控制器方法的返回值
},
"error":function() {
alert("您的登录信息已经过期,请重新登录!");
location.href = "/user/login.html";
}
});
});