Spring MVC是一个优秀的Web框架,MyBatis是一个ORM数据持久化层框架,它们是两个独立的框架,之间没有直接的联系。由于Spring 框架提供了IoC 和Aop等功能,若把Spring MVC和MyBatis的对象交给Spring容器进行解耦合管理,不仅能大大增强系统的灵活性,便于功能扩展,还能通过Spring提供的服务简化代码,减少工作开发量,提高开发效率。
1、新建WebProject,加入Spring、Spring MVC、MyBatis、数据库驱动等相关jar文件
2、编写配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms
user=root
pwd=1898
注:其它属性根据实际情况设置
log4j.rootLogger=debug,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.easybuy=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=debug
#log4j.appender.CONSOLE.DatePattern=yyyy-MM-dd
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
######################################################################################
# Rolling File \u6587\u4ef6\u5927\u5c0f\u5230\u8fbe\u6307\u5b9a\u5c3a\u5bf8\u7684\u65f6\u5019\u4ea7\u751f\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6
######################################################################################
#log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
#log4j.appender.ROLLING_FILE.Threshold=INFO
#log4j.appender.ROLLING_FILE.File=${baojia.root}/logs/log.log
#log4j.appender.ROLLING_FILE.Append=true
#log4j.appender.ROLLING_FILE.MaxFileSize=5000KB
#log4j.appender.ROLLING_FILE.MaxBackupIndex=100
#log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
######################################################################################
# DailyRolling File \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=${EasyBuy.root}/logs/log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
classpath:database.properties
classpath:mappers/*.xml
application/json;charset=UTF-8
text/html;charset=UTF-8
application/json
WriteDateUseDateFormat
login
/WEB-INF/jsp/login.jsp
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
springmvc
/
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
contextConfigLocation
classpath:applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
注1: 由于Spring需要启动容器才能为其他框架提供服务,而Web应用程序的入口是被Web服务器控制的,因此无法在main()方法中通过创建ClassPathXMLApplicationContext 对象来启动容器。Spring提供了一个监听器类org.springframework.web.context.ContextLoaderListener
,该监听器实现了 ServletContextListener 接口,可以在Web容器启动的时候初始化Spring容器。
注2: 如果没有指定 contextConfigLocation 参数,ContextLoaderListener 默认会去查找/WEB-INF/applicationContext.xml
。即如果我们将配置文件命名为 ContextLoaderListener 并存放在WEB-INF目录下,可不指定contextConfigLocation 参数。
3、数据对象模型(cn.smbms.pojo)
4、DAO访问数据接口(cn.smbms.dao)
5、系统服务接口(cn.smbms.service)
6、前端控制层Controller(cn.smbms.controller)
7、系统工具类(cn.smbms.tools)
8、前端页面(WEB-INF/jsp)和静态资源文件(/WebRoot/statics)
开发Web应用时,有时会出现css样式无法应用的情况,若有引用js文件,此时js也是无法起效的。这是由于web.xml中配置的DispatcherServlet请求映射为"/"
,则Spring MVC将捕捉Web容器的所有请求,这其中也包括了静态资源的请求。Spring MVC会将他们当成一个普通请求处理,但是由于找不到对应处理器,所以按照常规方式引用静态资源文件将无法访问。所以需要采用
标签解决静态资源的访问问题。
注:
mapping:将静态资源映射到指定的路径(/statics)
location:本地静态资源文件所在的目录
Spring MVC通过 HandlerExceptionResolver 处理程序异常,包括处理器异常,数据绑定异常以及处理器执行时发生的异常。当发生异常时,Spring MVC会调用 resolveException() 方法,并转到ModelAndView 对应的视图中,作为一个异常报告页面反馈给用户。
1、局部异常处理
仅能处理指定Controller中的异常。使用@ExceptionHandler注解实现。
//验证登录
@RequestMapping(value = "/exlogin.html", method = RequestMethod.GET)
public String exLogin(@RequestParam String userCode, @RequestParam String userPassword) {
logger.debug("exLogin=============");
User user = userService.login(userCode, userPassword);
if (null == user) { //登录失败
throw new RuntimeException("用户名或密码不正确!");
}
return "redirect:/user/main.html";
}
@ExceptionHandler(value={RuntimeException.class})
public String handlerException(RuntimeException e,HttpServletRequest req){
req.setAttribute("e", e);
return "error";
}
注: 当用户发送请求进行登录时,调用处理器的exLogin()方法,该方法用于验证登录信息,当user==null
也就是登录失败的情况下,方法会抛出 RuntimeException 运行时异常,并指定了错误信息;而使用@ExceptionHandler(value={RuntimeException.class})
注解表示被注解的方法会拦截所有抛出的 RuntimeException ,并进行处理,在handlerException() 方法中将异常对象存放到了request作用域中,并转发到了error.jsp,error.jsp页面即可从request对象中获取错误信息并展示给用户。
2、全局异常处理
全局异常处理可使用 SimpleMappingExceptionResolver 来实现。它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。
error
@RequestMapping(value = "/exlogin.html", method = RequestMethod.GET)
public String exLogin(@RequestParam String userCode, @RequestParam String userPassword) {
logger.debug("exLogin=============");
User user = userService.login(userCode, userPassword);
if (null == user) { //登录失败
throw new RuntimeException("用户名或密码不正确!");
}
//重定向URL请求,该请求用于进入login.jsp登录页面
return "redirect:/user/main.html";
}
${exception.message}
获取异常信息THE END
关注微信公众号【程序媛琬淇】,专注分享Java干货,给你意想不到的收获。