JAVA配置注解方式搭建简单的SpringMVC前后台交互系统
前面兩篇文章介紹了 基于XML方式搭建SpringMVC前后臺(tái)交互系統(tǒng)的方法,博文鏈接如下:
http://www.cnblogs.com/hunterCecil/p/8252060.html
http://www.cnblogs.com/hunterCecil/p/6924935.html
本文重點(diǎn)介紹一下基于java配置+注解方式搭建系統(tǒng)的過(guò)程步驟。
一、摘要
1、所需軟件列表:
1) tomcat : apache-tomcat-7.0.54 服務(wù)端容器
2) Intellij: Intellij IDEA 2016.3.1 ?開(kāi)發(fā)工具
3) Syslog: SQLyog Community 數(shù)據(jù)庫(kù)工具
2. 步驟簡(jiǎn)述:
1) 新建一個(gè) Java 項(xiàng)目, 按下圖依次選擇:
2) 項(xiàng)目目錄如下:
各目錄存儲(chǔ)文件如下:
(1)java.com : 目錄下用于存放后臺(tái)代碼:
config: 配置啟動(dòng)類
controller: 應(yīng)用層實(shí)現(xiàn)類
dao: 數(shù)據(jù)訪問(wèn)層的bean
entity: 對(duì)象實(shí)體類
service: 業(yè)務(wù)層bean, 具體的數(shù)據(jù)庫(kù)操作實(shí)現(xiàn)類
(2)resource:
jdbc.properties: 數(shù)據(jù)庫(kù)配置
log4j.properties: 日志配置相關(guān)屬性
users.sql: 建表語(yǔ)句
(3)webapp: 客戶端展示相關(guān)文件
二、 相關(guān)配置文件
1. web.xml配置(用于配置Spring 相關(guān)配置項(xiàng):上下文、日志、字符集、監(jiān)聽(tīng)器等通過(guò)配置文件加載,這里只配置welcome-file-list及session-config)
2. jdbc. properties
jdbc.driver = com.mysql.jdbc.Driver db.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 db.username = root db.password = *****3. log4j.properties
#日志輸出級(jí)別 log4j.rootLogger=INFO,stdout,other#設(shè)置stdout的日志輸出控制臺(tái) log4j.appender.stdout=org.apache.log4j.ConsoleAppender #輸出日志到控制臺(tái)的方式,默認(rèn)為System.out log4j.appender.stdout.Target = System.out #設(shè)置使用靈活布局 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #靈活定義輸出格式 log4j.appender.stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n#設(shè)置other的日志輸出控制臺(tái) log4j.appender.other=org.apache.log4j.RollingFileAppender #設(shè)置other的輸出日志 log4j.appender.other.File=/WEB-INF/logs/log.log #設(shè)置other的日志最大限制 log4j.appender.other.MaxFileSize=1024KB #最多只保存20個(gè)備份文件 log4j.appender.other.MaxBackupIndex=1000 #輸出INFO級(jí)別以上的日志 og4j.appender.other.Threshold=INFO #設(shè)置使用靈活布局 log4j.appender.other.layout=org.apache.log4j.PatternLayout #靈活定義輸出格式 log4j.appender.other.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %t %m %n4. uses.sql
-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` (`id` tinyint (20),`name` varchar (90),`age` tinyint (100),PRIMARY KEY (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ---------------------------- -- Records of user -- ---------------------------- insert into `user` (`id`, `name`, `age`) values('2','zhangsan','32'); insert into `user` (`id`, `name`, `age`) values('3','lisi','33'); insert into `user` (`id`, `name`, `age`) values('1','wangwu','12'); 5. config目錄下文件:
DatabaseConfig
PropertiesConfig
@Configuration @PropertySource(value={"classpath:jdbc.properties"}) public class PropertiesConfig {@Beanpublic static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {return new PropertySourcesPlaceholderConfigurer();} }RootConfig
@Configuration @ComponentScan(basePackages = {"com"}) public class RootConfig { }WebConfig
@Configuration @EnableWebMvc @EnableAspectJAutoProxy @EnableTransactionManagement @ComponentScan("com.controller") @MapperScan("com.dao") public class WebConfig extends WebMvcConfigurerAdapter {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");resolver.setExposeContextBeansAsAttributes(true);return resolver;}@Beanpublic StringHttpMessageConverter stringHttpMessageConverter(){return new StringHttpMessageConverter();}@Beanpublic MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){return new MappingJackson2HttpMessageConverter();}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(stringHttpMessageConverter());converters.add(mappingJackson2HttpMessageConverter());super.configureMessageConverters(converters);}/*** 啟用spring mvc 的注解*/public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();} }WebAppInitializer
/*** 配置SpringMVC需要添加DispatchServlet ,* DispatcherServlet主要負(fù)責(zé)前端調(diào)用URL的分發(fā),* 它在Web容器初始化的時(shí)候被注冊(cè)。* 這里配置中繼承了DispatchServlet 的一個(gè)抽象類AbstractAnnotationConfigDispatcherServletInitializer ,* 此抽象類的父類在實(shí)例化的時(shí)候會(huì)注冊(cè)一個(gè)DispatchServlet到容器中* 這里配置了容器初始化時(shí)需要加載的配置類 RootConfig,PropertiesConfig 和 WebConfig*/ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {/** 應(yīng)用上下文、配置文件讀取,數(shù)據(jù)庫(kù)配置*/@Overrideprotected Class<?>[] getRootConfigClasses() {System.out.println("======1.應(yīng)用上下文、配置文件讀取,數(shù)據(jù)庫(kù)配置 load ================");return new Class<?>[]{RootConfig.class, PropertiesConfig.class, DatabaseConfig.class};}/* web上下文 */@Overrideprotected Class<?>[] getServletConfigClasses() {System.out.println("======2.web上下文 load ================");return new Class<?>[]{WebConfig.class};}/* DispatcherServlet的映射路徑 */@Overrideprotected String[] getServletMappings() {System.out.println("======3.DispatcherServlet的映射路徑 load ================");return new String[]{"/"};}/* 注冊(cè)過(guò)濾器,映射路徑與DispatcherServlet一致,路徑不一致的過(guò)濾器需要注冊(cè)到另外的WebApplicationInitializer中*/@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");characterEncodingFilter.setForceEncoding(true);return new Filter[]{characterEncodingFilter};} }6. ?controller-TestController
@Controller public class TestController {@Autowired@Qualifier("userService")private UserService userService;@RequestMapping(value = "/test", method = RequestMethod.GET)public String test() {return "test";}@RequestMapping(value = "/getuser/{username}", method = RequestMethod.GET)@ResponseBodypublic User getUser(@PathVariable String username) {return userService.loadUserByUsername(username);} }7. dao-UserDao
@Controller public class TestController {@Autowired@Qualifier("userService")private UserService userService;@RequestMapping(value = "/test", method = RequestMethod.GET)public String test() {return "test";}@RequestMapping(value = "/getuser/{username}", method = RequestMethod.GET)@ResponseBodypublic User getUser(@PathVariable String username) {return userService.loadUserByUsername(username);} }8. entity-User
public class User {private Integer id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;} }9. log-logAspect
@Component @Aspect public class LogAspect {private static final Logger logger = Logger.getLogger(LogAspect.class.getName());@Pointcut("execution(* com.controller.*.*(..))")public void performance() {}@Before("performance()")public void optionBefore(JoinPoint joinPoint){System.out.println("@Before開(kāi)始執(zhí)行"+joinPoint.getSignature().getDeclaringTypeName() +"." + joinPoint.getSignature().getName());}@After("performance()")public void optionAfter(JoinPoint joinPoint){System.out.println("@After結(jié)束執(zhí)行"+joinPoint.getSignature().getDeclaringTypeName() +"." + joinPoint.getSignature().getName());}@Around("performance()")public Object optionAround(ProceedingJoinPoint pjp) throws Throwable {Object retVal = null;System.out.println("@Around start..");try {retVal = pjp.proceed();} catch (Throwable ex) {System.out.println("error in @Around");throw ex;}System.out.println("@Around end");return retVal;}@AfterReturning(pointcut = "performance()", returning = "returnValue")public void optionAfterReturn(JoinPoint joinPoint, Object returnValue) {System.out.println("@AfterReturning:目標(biāo)方法為:" +joinPoint.getSignature().getDeclaringTypeName() +"." + joinPoint.getSignature().getName());System.out.println("@AfterReturning:參數(shù)為:" +Arrays.toString(joinPoint.getArgs()));System.out.println("@AfterReturning:返回值為:" + returnValue);System.out.println("@AfterReturning:被織入的目標(biāo)對(duì)象為:" + joinPoint.getTarget());}@AfterThrowing(pointcut = "performance()", throwing = "e")public void optionError(JoinPoint joinPoint, Throwable e) {logger.log(Level.WARNING,"異常方法:{" + joinPoint.getTarget().getClass().getName() +"." + joinPoint.getSignature().getName() + "}" +"異常類型:{" + e.getClass().getName() + "}" +"異常信息:{" + e.getMessage() + "}" +"參數(shù):{" + Arrays.toString(joinPoint.getArgs()) + "}", e);} }10. service-UserService
public interface UserService {User loadUserByUsername(String username);void saveUser(User user); }?11. service-impl-UserServiceImpl
@Service("userService") public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Transactional(readOnly = true)public User loadUserByUsername(String username) {return userDao.loadUserByUsername(username);}@Transactionalpublic void saveUser(User user) {userDao.saveUser(user);} }12. maven 對(duì)應(yīng)的pom文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com</groupId><artifactId>springJavaConfig</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>springJavaConfig Maven Webapp</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.6</java.version></properties><dependencies><dependency><!--Unit Test --><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!-- Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.3.2.RELEASE</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!--Mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.3</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.8.5</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.5</version></dependency></dependencies><build><finalName>springJavaConfig</finalName></build> </project>
三. 啟動(dòng)過(guò)程打印日志:
Connected to server [2018-01-17 10:47:20,950] Artifact springJavaConfig:war exploded: Artifact is being deployed, please wait... 一月 17, 2018 10:47:23 上午 org.apache.catalina.startup.TldConfig execute 信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. ======1.應(yīng)用上下文、配置文件讀取,數(shù)據(jù)庫(kù)配置 load ================ ======2.web上下文 load ================ ======3.DispatcherServlet的映射路徑 load ================ 一月 17, 2018 10:47:24 上午 org.springframework.web.context.ContextLoader initWebApplicationContext 信息: Root WebApplicationContext: initialization started 一月 17, 2018 10:47:24 上午 org.springframework.web.context.support.AnnotationConfigWebApplicationContext prepareRefresh 信息: Refreshing Root WebApplicationContext: startup date [Wed Jan 17 10:47:24 CST 2018]; root of context hierarchy 一月 17, 2018 10:47:24 上午 org.springframework.web.context.support.AnnotationConfigWebApplicationContext loadBeanDefinitions 信息: Registering annotated classes: [class com.config.RootConfig,class com.config.PropertiesConfig,class com.config.DatabaseConfig] 一月 17, 2018 10:47:25 上午 com.config.DatabaseConfig dataSource 信息: mysql url:jdbc:mysql://10.42.120.201:3306/test?useUnicode=true&characterEncoding=UTF-8 一月 17, 2018 10:47:25 上午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping register 信息: Mapped "{[/test],methods=[GET]}" onto public java.lang.String com.controller.TestController.test() 一月 17, 2018 10:47:25 上午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping register 信息: Mapped "{[/getuser/{username}],methods=[GET]}" onto public com.entity.User com.controller.TestController.getUser(java.lang.String) 一月 17, 2018 10:47:25 上午 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping registerHandler 信息: Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler] 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter initControllerAdviceCache 信息: Looking for @ControllerAdvice: Root WebApplicationContext: startup date [Wed Jan 17 10:47:24 CST 2018]; root of context hierarchy 一月 17, 2018 10:47:26 上午 org.springframework.web.context.ContextLoader initWebApplicationContext 信息: Root WebApplicationContext: initialization completed in 2370 ms 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.DispatcherServlet initServletBean 信息: FrameworkServlet 'dispatcher': initialization started 一月 17, 2018 10:47:26 上午 org.springframework.web.context.support.AnnotationConfigWebApplicationContext prepareRefresh 信息: Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Wed Jan 17 10:47:26 CST 2018]; parent: Root WebApplicationContext 一月 17, 2018 10:47:26 上午 org.springframework.web.context.support.AnnotationConfigWebApplicationContext loadBeanDefinitions 信息: Registering annotated classes: [class com.config.WebConfig] 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping register 信息: Mapped "{[/test],methods=[GET]}" onto public java.lang.String com.controller.TestController.test() 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping register 信息: Mapped "{[/getuser/{username}],methods=[GET]}" onto public com.entity.User com.controller.TestController.getUser(java.lang.String) 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping registerHandler 信息: Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler] 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter initControllerAdviceCache 信息: Looking for @ControllerAdvice: WebApplicationContext for namespace 'dispatcher-servlet': startup date [Wed Jan 17 10:47:26 CST 2018]; parent: Root WebApplicationContext 一月 17, 2018 10:47:26 上午 org.springframework.web.servlet.DispatcherServlet initServletBean 信息: FrameworkServlet 'dispatcher': initialization completed in 356 ms [2018-01-17 10:47:26,774] Artifact springJavaConfig:war exploded: Artifact is deployed successfully [2018-01-17 10:47:26,775] Artifact springJavaConfig:war exploded: Deploy took 5,825 milliseconds可以看到,WebAppInitializer類中我們的配置類已經(jīng)按順序加載過(guò)了。
四、 測(cè)試
url 輸入 http://localhost:8080/getuser/zhangsan,可以查看切面部分打印日志如下:
@Around start.. @Before開(kāi)始執(zhí)行com.controller.TestController.getUser @Around end @After結(jié)束執(zhí)行com.controller.TestController.getUser @AfterReturning:目標(biāo)方法為:com.controller.TestController.getUser @AfterReturning:參數(shù)為:[zhangsan] @AfterReturning:返回值為:com.entity.User@182bab1a @AfterReturning:被織入的目標(biāo)對(duì)象為:com.controller.TestController@24b0c989?
轉(zhuǎn)載于:https://www.cnblogs.com/hunterCecil/p/8302783.html
總結(jié)
以上是生活随笔為你收集整理的JAVA配置注解方式搭建简单的SpringMVC前后台交互系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

- 上一篇: 集成算法中的Bagging
- 下一篇: MobaXterm使用