SpringMVC-AJAX-PostgreSQL-cmcG

目录

该工程的下载地址…

文件目录截图

在这里插入图片描述

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,有数字45入替换为数字,有几个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";
		}
	});
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值