配色: 字号:
spring与spring mvc集成多种技术构建复杂工程
2016-12-03 | 阅:  转:  |  分享 
  
spring与springmvc集成多种技术构建复杂工程

使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎、数据库连接池、orm框架、缓存服务、邮件服务、rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不时更新,以备参考!



spring

在普通的java工程中引入spring,只需要配置以下依赖



org.springframework

spring-context

3.2.17.RELEASE



实际开发中,如果你用了log4j等日志框架,最好排除掉spring对commons-logging的依赖,写demo就不用了





commons-logging

commons-logging





建一个spring-conf.xml,放在src/main/java目录(也就是所有包和类的根目录,即classpath),内容如下




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">







建一个Test.java类,这个类就是spring-conf.xml文件中定义的那个bean

packagecom.xmyself;

publicclassTest{

publicvoidtest(){

System.out.println("springisrunning");

}

}

写带有main方法的主类

packagecom.xmyself;

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;



publicclassMain{

publicstaticvoidmain(String[]args){

@SuppressWarnings("resource")

ApplicationContextcontext=newClassPathXmlApplicationContext("spring-conf.xml");

Testtest=context.getBean(Test.class);

test.test();

}

}

运行Main,就能看到“springisrunning”输出,spring配置完成



springmvc

springmvc是配置在web工程中的,使用springmvc也只要配置一个依赖



org.springframework

spring-webmvc

3.2.17.RELEASE



整一个Test.java类,这是个controller

packagecom.xmyself.controller;



importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.ResponseBody;



@Controller

publicclassTest{

@RequestMapping("/test")

@ResponseBody

publicStringtest(){

return"springmvcrunning";

}

}

在src/main/resources目录下建一个spring目录,里面放一个mvc-init.xml,内容如下




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"

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">







这个配置文件扫描了Test.java,最后修改web.xml来加载这个配置文件




xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

version="2.5">

spring3mvc





spring

org.springframework.web.servlet.DispatcherServlet



contextConfigLocation

classpath:/spring/mvc-init.xml



1





spring

/





初始化DispatcherServlet如果没有指定xml文件地址,spring默认去WEB-INF目录找[servlet-name]-servlet.xml,这里就是spring-servlet.xml



启动工程,浏览器访问http:localhost:8080/springmvc/test就能看到返回test值了,springmvc配置完成



freemarker模板引擎

springmvc通常要配置模板引擎,因为jsp太复杂了,而且有损mvc模型



freemarker是一种严格遵循mvc模型的模板引擎,现在介绍它的springmvc中的配置



首先配置依赖



org.springframework

spring-context-support

3.2.17.RELEASE





org.freemarker

freemarker

2.3.23



为什么要依赖spring-context-support?因为freemarker使用的视图解析器是由spring提供的,这个解析器就在spring-context-support的jar中,下面的配置过程会让你明白,在springmvc的mvc-init.xml中配置freemarker

















配置freemarker的本质是初始化上面的两个bean,所以,你可以把这段配置写在任意的xml文件,只要springmvc能加载就行



在WEB-INF目录建一个page目录,里面放一个freemarker.ftl文件,内容只有一句话“freemarkerpage中文乱码测试”



最后,在控制器写一个方法

@RequestMapping("/freemarker")

publicStringfreemarker(){

return"freemarker";

}

启动工程,访问http://localhost:8080/springmvc/freemarker就能看到“freemarkerpage中文乱码测试”这句话了



thymeleaf模板引擎

thymeleaf也是一个mvc模型的模板引擎,它的后缀是.html,所以thymeleaf模板的好处是不用渲染就能看到内容,现在spring也是推荐用thymeleaf作为springmvc的模板引擎



配置依赖



org.thymeleaf

thymeleaf-spring3

2.1.5.RELEASE



这是thymeleaf与spring连接用的jar,它依赖了thymeleaf的jar,对于spring3和spring4,thymeleaf的依赖是不同的,配置也稍有不同,这点要注意,下面就开始配置thymeleaf



























这段配置放在springmvc能读到的任意xml文件都可以



在WEB-INF目录建一个page目录,里面放一个thymeleaf.html,内容只有一行“thymeleafpage中文乱码测试”



最后,在控制器写一个方法

@RequestMapping("/thymeleaf")

publicStringthymeleaf(){

return"thymeleaf";

}

启动工程,访问http://localhost:8080/springmvc/thymeleaf就能看到“thymeleafpage中文乱码测试”这句话了



tomcatpool数据库连接池

可能用dbcp、c3p0连接池的人多一点,其实tomcatpool更好,具体怎么好请google,下面介绍针对mysql数据库的配置过程



配置依赖



mysql

mysql-connector-java

5.1.27





org.apache.tomcat

tomcat-jdbc

7.0.73



tomcat-jdbc依赖了tomcat-juli,所以如果你在eclipse中为工程加入了tomcat的库,还需要单独加一个tomcat-juli的jar



下面整一个Main.java来测试连接

packagecom.xmyself;



importjava.sql.Connection;

importjava.sql.ResultSet;

importjava.sql.Statement;

importorg.apache.tomcat.jdbc.pool.DataSource;

importorg.apache.tomcat.jdbc.pool.PoolProperties;



publicclassMain{

publicstaticvoidmain(String[]args)throwsException{

PoolPropertiesp=newPoolProperties();

p.setUrl("jdbc:mysql://localhost:3306/mysql");

p.setDriverClassName("com.mysql.jdbc.Driver");

p.setUsername("root");

p.setPassword("root");

p.setJmxEnabled(true);

p.setTestWhileIdle(false);

p.setTestOnBorrow(true);

p.setValidationQuery("SELECT1");

p.setTestOnReturn(false);

p.setValidationInterval(30000);

p.setTimeBetweenEvictionRunsMillis(30000);

p.setMaxActive(100);

p.setInitialSize(10);

p.setMaxWait(10000);

p.setRemoveAbandonedTimeout(60);

p.setMinEvictableIdleTimeMillis(30000);

p.setMinIdle(10);

p.setLogAbandoned(true);

p.setRemoveAbandoned(true);

p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"

+"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

DataSourcedatasource=newDataSource();

datasource.setPoolProperties(p);

Connectioncon=null;

try{

con=datasource.getConnection();

Statementst=con.createStatement();

ResultSetrs=st.executeQuery("selectfromuser");

intcnt=1;

while(rs.next()){

System.out.println((cnt++)+".Host:"+rs.getString("Host")

+"User:"+rs.getString("User")+"Password:"

+rs.getString("Password"));

}

rs.close();

st.close();

}finally{

if(con!=null)

try{

con.close();

}catch(Exceptionignore){

}

}

}

}

这个例子是tomcat官方文档给出的,运行结果如下

1.Host:localhostUser:rootPassword:81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

2.Host:127.0.0.1User:rootPassword:81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

3.Host:::1User:rootPassword:81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

4.Host:localhostUser:Password:

5.Host:%User:rootPassword:81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

那spring怎么集成tomcatpool呢?配置xml让spring加载就好了













这里配置的属性与官方例子set方法中的属性完全相同,其余的我就不配置了



然后写一个测试,这里以springmvc为例,写一个controller,具体代码与上例相同

@Controller

publicclassTest{

@Autowired

privateDataSourcedatasource;



@RequestMapping("/test")

@ResponseBody

publicStringtest()throwsException{

Connectioncon=datasource.getConnection();

//拿到con就可以操作了

return"springmvcrunning";

}

}

mybatis持久化框架

mybatis轻量级,配置简单,使用方便,我们在tomcatpool基础上来配置,当然,使用tomcatpool配置只是为了得到dataSource,如果你用dbcp、c3p0等连接池,只要修改下这个dataSource的配置就好,mybatis本身的配置不用修改



配置依赖



org.mybatis

mybatis

3.4.1



我们定义一个TestDao.java接口,这就是mybatis要实现的东西

packagecom.xmyself.dao;

publicinterfaceTestDao{

publicStringtest();

}

在src/main/resources目录建一个mapper目录,里面放一个TestDao.xml,内容如下




PUBLIC"-//mybatis.org//DTDMapper3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">





select"test"





mybatis通过一个xml文件实现了TestDao.java接口,很显然,这个实现过程肯定要用到dataSource,接下来的配置就是将TestDao.java、TestDao.xml、dataSource三者关联起来,在spring的xml配置文件(哪个配置文件没关系,只要spring能加载)添加如下内容





























这个配置我其实有点疑惑,TestDao.xml中有对TestDao.java接口的声明,所以应该只需要将dataSource与TestDao.xml做关联就够了,但实际上我没有找到这种方式



这时候启动工程,spring加载过程会报错,其实我是故意的,^_^



1

Causedby:java.lang.ClassNotFoundException:org.mybatis.spring.SqlSessionFactoryBean

因为spring内部没有直接对mybatis的支持,所以需要依赖中间层jar包,另外,还需要spring-jdbc提供对dao的支持



org.mybatis

mybatis-spring

1.3.0





org.springframework

spring-jdbc

3.2.17.RELEASE



我们整一个类来测试吧,还是以springmvc为例,整一个controller

@Controller

publicclassTest{

@Autowired

privateTestDaotestDao;



@RequestMapping("/test")

@ResponseBody

publicStringtest()throwsException{

System.out.println(testDao.test());

return"springmvcrunning";

}

}

浏览器访问http://localhost:8080/springmvc/test就能看到后台输出“test”,mybatis配置完成



redis缓存服务

redis是一种key-value非关系型数据库,特点是运行于内存中,速度快,作为缓存服务器非常不错



java对redis数据库的访问是通过jedis完成的



配置依赖



redis.clients

jedis

2.9.0



初始化jedis连接,假设redis服务器地址为:192.168.253.128,端口:6379























这段代码放在哪没关系,只要spring能加载到,注意,构造器注入一定要指明type类型



然后我们整一个类来测试,以springmvc为例,整一个controller

@Controller

publicclassTest{

@Autowired

privateJedisPoolpool;



@RequestMapping("/test")

@ResponseBody

publicStringtest(){

Jedisredis=pool.getResource();

redis.set("test","test");

System.out.println(redis.get("test"));

return"springmvcrunning";

}

}

浏览器访问http://localhost:8080/springmvc/test,就能看到后台输出“test”,jedis配置完成



dubbo分布式服务

dubbo是阿里巴巴开源的分布式rpc框架,现在假设服务提供方正常工作,我们只配置在spring中使用dubbo服务



配置依赖,假设dubbo使用zookeeper作为注册中心



com.alibaba

dubbo

2.5.3





org.springframework

spring









com.101tec

zkclient

0.4





org.apache.zookeeper

zookeeper





zookeeper

org.apache.zookeeper









org.apache.zookeeper

zookeeper

3.4.9



在src/main/resources的spring目录放一个dubbo-client.xml,内容如下




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.baiyuewang.net/schema/dubbo

http://code.alibabatech.com/schema/dubbo/dubbo.xsd">















然后让spring加载dubbo-client.xml



1



启动工程,DemoService接口提供的方法就可以用了,就像调用本地方法一样

@Controller

publicclassTest{

@Autowired

privateDemoServicedemoService;



@RequestMapping("/test")

@ResponseBody

publicStringtest(){

returndemoService.test("dubbo-demo-test");

}

}

当然,服务使用者需要拿到服务提供者声明服务接口的jar,在公司内部,这通常也是一个依赖



com.xmyself

dubbo-demo-client

0.0.1-SNAPSHOT



献花(0)
+1
(本文系thedust79首藏)