从去年9月21开始写博客,今天整一年了。
从开始写文章到现在,写过spring的,springmvc的,spring与其他框架整合的(包括hibernate,ehcache,shiro),写过一些工具类,写过微信公众号开发,写过前端的一些小demo,虽然一直在用mybatis却一直没写。
今天写一个比较全面的测试项目,包括maven,spring,springmvc,solr,mongodb的,一是强哥安排的Solr任务,二是学习与整理。
这篇文章更像是一个详细的基于maven的springmvc环境搭建
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
"-//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 Applicationdisplay-name>
web-app>
如果想换更高的版本可以直接修改web.xml这里我使用3.0
web.xml
<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建立webapp3.0以上的Maven项目
创建好之后我们导入到eclipse中
File->Import->Maven->Existing Maven Projects
新导入的项目有个报错
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
该报错是由于没有引入jsp和servlet的依赖而导致的
引入依赖,因为后面会用jstl,所以一并引入
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<scope>providedscope>
<version>3.1.0version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jsp-apiartifactId>
<scope>providedscope>
<version>2.0version>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
引入之后项目报错就消失了。
命名行创建的maven项目中并没有为我们创建相应的java和test目录(我的电脑上一直不创建,不知道为什么,如果已经创建了就不需要再创建)
在src下新建一个test目录,test目录和main目录在一级
在main下面新建java目录,在test下新建java目录
建好目录之后项目看着有点怪怪的。
我们在项目了上右键->Refresh
项目结构就好了。
参考
Maven的安装和配置
Eclipse建立webapp3.0以上的Maven项目
Maven中关于serlvet和jstl的引用
项目结构配置好之后我们开始配置spring和其他依赖
由于spring模块很多,这里采用spring官方文档推荐的BOM统一管理spring的版本。引入spring-framework-bom只有后面所有依赖的spring都无需指明版本,和spring-framework-bom 一个版本。
BOM
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-framework-bomartifactId>
<version>4.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
spring依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aspectsartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.5version>
dependency>
单元测试
自动生成的junit版本有点低。
改为如下(当前为4.12版)
为了整合spring进行测试引入spring-test
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<scope>testscope>
dependency>
日志记录,json和发送http请求
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.21version>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.6.2version>
dependency>
<dependency>
<groupId>org.jsongroupId>
<artifactId>jsonartifactId>
<version>20160810version>
dependency>
<dependency>
<groupId>org.apache.httpcomponentsgroupId>
<artifactId>httpclientartifactId>
<version>4.5.2version>
dependency>
<dependency>
<groupId>org.apache.httpcomponentsgroupId>
<artifactId>httpmimeartifactId>
<version>4.5.2version>
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
<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/>
<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>
<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数据在导入
<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>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/spring-core.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<filter>
<filter-name>charsetEncodingfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>charsetEncodingfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/spring-mvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-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"%>
<html>
<head>
<meta charset="utf-8">
<title>我是标题title>
head>
<body>
${msg }
body>
html>
好了,发布到tomcat
访问
http://localhost:8080/learn/solr/hello
Springmvc环境搭建完毕。
参考
一个简单的SpringMVC需要哪些jar包[Spring4]
再写就有点长了,下一篇写整合mongodb和solrj
- Maven创建项目时出现Generating project in Interactive mode就一直卡住的解决方案
- Eclipse建立webapp3.0以上的Maven项目
- Maven的安装和配置
- Eclipse建立webapp3.0以上的Maven项目
- Maven中关于serlvet和jstl的引用
- 一个简单的SpringMVC需要哪些jar包[Spring4]