从去年9月21开始写博客,今天整一年了。
从开始写文章到现在,写过spring的,springmvc的,spring与其他框架整合的(包括hibernate,ehcache,shiro),写过一些工具类,写过微信公众号开发,写过前端的一些小demo,虽然一直在用mybatis却一直没写。
今天写一个比较全面的测试项目,包括maven,spring,springmvc,solr,mongodb的,一是强哥安排的Solr任务,二是学习与整理。
这篇文章更像是一个详细的基于maven的springmvc环境搭建
Solr测试项目
maven创建javaee开发环境
mvn archetype:generate -DgroupId=com.gwc -DartifactId=learn -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=internal
创建过程中需要确认版本和报名,输入回车,属于Y即可
参考
Maven创建项目时出现Generating project in Interactive mode就一直卡住的解决方案
创建好之后结构如下
默认的webapp版本为2.3。
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
如果想换更高的版本可以直接修改web.xml这里我使用3.0
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
</web-app>
参考
创建好之后我们导入到eclipse中
导入项目并修改
File->Import->Maven->Existing Maven Projects
新导入的项目有个报错
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
该报错是由于没有引入jsp和servlet的依赖而导致的
引入依赖,因为后面会用jstl,所以一并引入
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
<version>2.0</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
引入之后项目报错就消失了。
命名行创建的maven项目中并没有为我们创建相应的java和test目录(我的电脑上一直不创建,不知道为什么,如果已经创建了就不需要再创建)
在src下新建一个test目录,test目录和main目录在一级
在main下面新建java目录,在test下新建java目录
建好目录之后项目看着有点怪怪的。
我们在项目了上右键->Refresh
项目结构就好了。
参考
Maven的安装和配置
Eclipse建立webapp3.0以上的Maven项目
Maven中关于serlvet和jstl的引用
spring环境配置与相关依赖配置
项目结构配置好之后我们开始配置spring和其他依赖
spring
由于spring模块很多,这里采用spring官方文档推荐的BOM统一管理spring的版本。引入spring-framework-bom只有后面所有依赖的spring都无需指明版本,和spring-framework-bom 一个版本。
BOM
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
spring依赖
<!-- spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!-- spring依赖的第三方 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
单元测试
自动生成的junit版本有点低。
改为如下(当前为4.12版)
为了整合spring进行测试引入spring-test
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 整合spring测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
日志记录,json和发送http请求
<!-- 日志记录 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<!-- json需要 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<!-- 发送http请求 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.2</version>
</dependency>
依赖配置之后我们导入配置文件
日志log4j.properties
放在src/main/resources目录下
#------------------------------------------------------------------------------------
# 日志输出级别
#------------------------------------------------------------------------------------
log4j.rootLogger=info, stdout, info_log, error_log
#------------------------------------------------------------------------------------
# 输出到控制台
#------------------------------------------------------------------------------------
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=%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%M] %c %L %m%n
#log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout
#------------------------------------------------------------------------------------
# info_log
#------------------------------------------------------------------------------------
log4j.appender.info_log=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info_log.File=/usr/logs/learn/info.log
log4j.appender.info_log.Append=true
log4j.appender.info_log.Threshold=INFO
log4j.appender.info_log.layout=org.apache.log4j.PatternLayout
log4j.appender.info_log.DatePattern='.'yyyy-MM-dd
log4j.appender.info_log.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%M] %c %L %m%n
#------------------------------------------------------------------------------------
# error_log
#------------------------------------------------------------------------------------
log4j.appender.error_log=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error_log.File=/usr/logs/learn/error.log
log4j.appender.error_log.Append=true
log4j.appender.error_log.Threshold=ERROR
log4j.appender.error_log.layout=org.apache.log4j.PatternLayout
log4j.appender.error_log.DatePattern='.'yyyy-MM-dd
log4j.appender.error_log.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%M] %c %L %m%n
#------------------------------------------------------------------------------------
# 我的配置
#------------------------------------------------------------------------------------
log4j.logger.org.springframework=info
测试一下日志
package test;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloTest {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void test() {
logger.info("info:{}", "info");
logger.error("error:{}", "error");
}
}
执行之后我们发现日志已经生效
并且error会单独输出到error.log
来配置spring
首先在src/main/resources目录下创建一个spring的目录,该目录中存放各种spring的配置,总体结构如下
先把项目的包结构建立起来
com.gwc.learn.controller放conttroller
com.gwc.learn.service放service
com.gwc.learn.dao放dao
com.gwc.learn.timer放定时任务
com.gwc.learn.util放一些工具类
先建一个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:p="http://www.springframework.org/schema/p"
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.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">
<mvc:annotation-driven/>
<!-- 只扫描Controller,不扫描Service -->
<context:component-scan base-package="com.gwc.learn">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 静态资源 -->
<mvc:resources location="/assets/" mapping="/assets/**"></mvc:resources>
<!-- jsp视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
再建一个spring-core.xml这个配置文件主要是导入一些其他的spring配置,比如数据库,定时任务,主要是为了将spring的配置分开,暂时没有导入,后面配置mongo数据在导入
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.gwc.learn" />
</beans>
然后配置web.xml
这里有一个上下文的spring-core.xml,其他配置都会被import进来,这样当配置文件比较大的时候看着清晰,配置起来方便。
<display-name>solr测试项目</display-name>
<!-- 加载spring上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-core.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 统一编码 -->
<filter>
<filter-name>charsetEncoding</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- SpringMVC的配置 -->
<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:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
写一个controller和jsp视图
com.gwc.learn.controller包下的HelloController.java
package com.gwc.learn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/solr")
public class HelloController {
@RequestMapping(value="/hello",method=RequestMethod.GET)
public String hello(Model model){
model.addAttribute("msg", "你好springMVC");
return "hello";
}
}
WEB-INF/views下的hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>我是标题</title>
</head>
<body>
${msg }
</body>
</html>
好了,发布到tomcat
访问
http://localhost:8080/learn/solr/hello
Springmvc环境搭建完毕。
参考
再写就有点长了,下一篇写整合mongodb和solrj