半注解开发:
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置spring-->
<context-param>
<!-- 这里的全局名是固定的-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springapplicationContext.xml</param-value>
</context-param>
<!--服务器启动时会掉头内置监听器初始化加载spring的contextConfigLocation上下文对象-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置springmvc-->
<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_mvc.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>
<!--post表单乱码过滤器-->
<filter>
<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>
spring.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:aop ="http://www.springframework.org/schema/aop"
xmlns:tx ="http://www.springframework.org/schema/tx"
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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 组件扫描-->
<context:component-scan base-package="com.liu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbcSourceName}"/>
<property name="url" value="${jdbcUrl}"/>
<property name="username" value="${jdbcname}"/>
<property name="password" value="${jdbcPassword}"/>
</bean>
<!--整合mybatis-->
<!-- 配置sessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.liu.domain"/>
</bean>
<!-- 配置mapper 扫描, 放入spring 容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.liu.dao"/>
</bean>
<!--事务管理-->
<!-- 平台事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务的注解驱动-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!--aop开发-->
<!--aop自动代理-->
<aop:aspectj-autoproxy/>
</beans>
springmvc.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"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.liu.Servlet"/>
<!--配置mvc注解驱动- json对象-->
<mvc:annotation-driven/>
<!--配置内部视图解析器-->
<bean id="resourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!--前缀-->
<property name="prefix" value="/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--静态资源权限控制-->
<!--对wepapp下的所有资源放行 一旦遇到这些资源告诉springmvc交给tomcat服务器处理-->
<mvc:default-servlet-handler/>
<!-- 拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--配置对那些资源拦截-->
<mvc:mapping path="/Student"/>
<mvc:mapping path="/Student**"/>
<!--自定义拦截器的位置-->
<bean class="com.liu.Servlet.Interceptor.interceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
<!--aop注解驱动-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
项目结构
表现层项目结构
拦截器:
package com.liu.Servlet.Interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Component
public class interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user==null)
{
System.out.println("还未登录!");
session.setAttribute("error","请先登录!");
response.getWriter().write("error");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("posthandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("aftercompletion");
}
}
异常处理器:
package com.liu.Servlet.Excepttion_interceptor;
import com.liu.Exception.BusinessException;
import com.liu.Exception.Systemxception;
import com.liu.Servlet.Result.Code;
import com.liu.Servlet.Result.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
@ResponseBody
public class ProjectExceptionAdvice {
@ExceptionHandler(Systemxception.class)
public Result doSystemException(Systemxception ex)
{ //记录日志
//发送邮件给开发人员
//发短信给运维人员
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex)
{
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(Exception.class)
public Result doExcept(Exception ex)
{ //记录日志
//发送邮件给开发人员
//发短信给运维人员
return new Result(Code.SYStem_unknow_error,null,"系统繁忙,请联系管理人员!");
}
}
结果集:
package com.liu.Servlet.Result;
public class Result {
private Object data;
private String msg;
private Integer code;
public Result(Integer code,Object data,String msg) {
this.data = data;
this.msg = msg;
this.code = code;
}
public Result(Integer code,Object data) {
this.data = data;
this.code = code;
}
public Result(Integer code,String msg) {
this.msg = msg;
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
状态编码:
package com.liu.Servlet.Result;
public class Code {
public static final Integer Save_OK=20011;
public static final Integer Delete_OK=20021;
public static final Integer UPdate_OK=20031;
public static final Integer Get_OK=20041;//这里把单个查询和所有查询归到一类 只区分查询成功或失败
public static final Integer Save_NO=20010;
public static final Integer Delete_NO=20020;
public static final Integer UPdate_NO=20030;
public static final Integer Get_NO=20040;
public static final Integer SYStem_unknow_error=50001;
public static final Integer SYStem_Timeout_error=50002;
public static final Integer pojiect_validate_error=60001;
public static final Integer pojiect_business_error=60002;
public static final Integer userAdd_OK=20051;
public static final Integer userAdd_No=20050;
public static final Integer userseek_OK=20061;
public static final Integer userseek_NO=20060;
}
aop操作:
package com.liu.Servlet.servletaop;
import com.liu.Exception.BusinessException;
import com.liu.Servlet.Result.Code;
import com.liu.service.logicService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@Aspect
public class advice {
@Autowired
logicService al;
@Pointcut("execution(* com.liu.Servlet.stuServletnew.*er(..))")
public void point1(){}
@Pointcut("execution(* com.liu.service.stuService.*(..))")
public void point2(){}
@Before("point1()")
public void add_change(JoinPoint point) throws Throwable {
Object[] args = point.getArgs();
System.out.println("aopadd-------");
Map<String, String> arg = (Map<String, String>) args[0];
String a = arg.get("age");
if (a.matches("[0-9]+") == false) {
throw new BusinessException(Code.pojiect_business_error, "你输入的数据不符合规范!");
} else {
if (Integer.valueOf(a) > 100) {
throw new BusinessException(Code.pojiect_business_error, "请输入合适的年龄!");
}
}
}
@AfterReturning("point2()")
public void logicscu(JoinPoint joinPoint)
{
Object[] args = joinPoint.getArgs();
Object arg=null;
for(int i=0;i<args.length;i++)
{
arg= args[0].toString();
}
//拿到目标方法的方法签名
Signature signature = joinPoint.getSignature();
//获取方法名
String name = signature.getName();
al.addlogic(name+" 方法执行成功!执行参数为 "+arg);
}
@AfterThrowing("point2()")
public void logicerro(JoinPoint joinPoint)
{
Object[] args = joinPoint.getArgs();
Object arg = null;
for(int i=0;i<args.length;i++)
{
arg= args[0].toString();
}
//拿到目标方法的方法签名
Signature signature = joinPoint.getSignature();
//获取方法名
String name = signature.getName();
al.addlogic(name+" 方法执行失败!执行参数为 "+ arg);
}
}
全注解开发:
项目结构
configh配置:
jdbcconfig:
package com.liu.configh;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
public class jdbcConfig {
@Value("${jdbcSourceName}")
private String jdbcSourceName;
@Value("${jdbcUrl}")
private String jdbcUrl;
@Value("${jdbcname}")
private String jdbcname;
@Value("${jdbcPassword}")
private String jdbcPassword;
@Bean
public DataSource dataSource()
{
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(jdbcSourceName);
druidDataSource.setUrl(jdbcUrl);
druidDataSource.setUsername(jdbcname);
druidDataSource.setPassword(jdbcPassword);
return druidDataSource;
}
@Bean//设置事务管理器
public PlatformTransactionManager transactionManager(DataSource dataSource)
{
DataSourceTransactionManager ptm=new DataSourceTransactionManager();
ptm.setDataSource(dataSource);
return ptm;
}
}
mbatisconfigh:
package com.liu.configh;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class mybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource)
{
SqlSessionFactoryBean sql = new SqlSessionFactoryBean();
sql.setTypeAliasesPackage("com.liu.domain");
sql.setDataSource(dataSource);
return sql;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer()
{
MapperScannerConfigurer ma = new MapperScannerConfigurer();
ma.setBasePackage("com.liu.dao");//要扫描的mapper接口所在的包
return ma;
}
}
springconfigh
package com.liu.configh;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
@ComponentScan(value = "com.liu",
excludeFilters =@ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
) )
@PropertySource("classpath:jdbc.properties")
@Import({jdbcConfig.class, mybatisConfig.class})
@EnableTransactionManagement
@EnableAspectJAutoProxy
public class SpringConfig {
}
springmvcconfigh
package com.liu.configh;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan({"com.liu.Servlet","com.liu.configh"})
@EnableWebMvc
public class SpringMvcConfig {
}
springmvcsupportconfigh
package com.liu.configh;
import com.liu.Servlet.Interceptor.interceptor1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class Springmvcsupport extends WebMvcConfigurationSupport {
@Autowired
private interceptor1 in;
//拦截器触发
@Override//拦截器,拦截以/Student结尾和以任意请求结尾倒数第二层请求为Student的 请求
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(in).addPathPatterns("/Student","/Student/*");
}
@Override//配置使用springmvc容器启动时对于以下请求放行(不做处理)交给tomcat进行处理
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 如果遇到/css/**路径就放行 到webapp的css目录下找资源文件
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/element-ui/**").addResourceLocations("/element-ui/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/html/**").addResourceLocations("/html/");
registry.addResourceHandler("/jsp/**").addResourceLocations("/jsp/");
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}
}
webconfigh:
package com.liu.webinit;
import com.liu.configh.SpringConfig;
import com.liu.configh.SpringMvcConfig;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
public class Servletsimpleinit extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {SpringMvcConfig.class};
}
//设置springmvc访问路径类型
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//设置
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
}
异常处理器:
package com.liu.Servlet.Excepttion_interceptor;
import com.liu.Exception.BusinessException;
import com.liu.Exception.Systemxception;
import com.liu.Servlet.Result.Code;
import com.liu.Servlet.Result.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler(Systemxception.class)
public Result doSystemException(Systemxception ex)
{ //记录日志
//发送邮件给开发人员
//发短信给运维人员
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex)
{
return new Result(ex.getCode(),null,ex.getMessage());
}
/* @ExceptionHandler(Exception.class)
public Result doExcept(Exception ex)
{ //记录日志
//发送邮件给开发人员
//发短信给运维人员
return new Result(Code.SYStem_unknow_error,null,"系统繁忙,请联系管理人员!");
}*/
}
拦截器:
package com.liu.Servlet.Interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Component
public class interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user==null)
{
System.out.println("还未登录!");
session.setAttribute("error","请先登录!");
response.getWriter().write("error");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("posthandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("aftercompletion");
}
}