SpringMVC之@RequestMapping、ThreadLocal、DBCP、JNDI数据源管理

一、SpringMVC之@RequestMapping

  • 通过参数条件缩小路径映射,params参数:URL中只有存在params指定的参数时才被允许访问路径映射的方法,如下所示:

1 @RequestMapping(value="/paramValue/{userName}",params="myParam",method = RequestMethod.GET)
2     public void setupForm(@PathVariable String userName) {
3         System.err.println("userName:" + userName);
4     }

例如当访问下面url时才会触发上面方法的执行:

http://localhost:8080/SMVCAnnotationCURD/user/paramValue/zhangsan?myParam
  • @RequestMapping 6个基本用法
  1. 基本用法,只有一个value,如下所示:
1 @RequestMapping("/getAll")
2     public ModelAndView getAllUser(){
3         UserDaoImpl userDao = new UserDaoImpl();
4         List<User> uList = userDao.getAllUser();
5         ModelAndView mv = new ModelAndView();  
6         mv.addObject("users", uList);  
7         mv.setViewName("userList");  
8         return mv;  
9     }

  当请求如下url时会执行上面方法:

http://localhost:8080/SMVCAnnotationCURD/user/getAll

    2.参数绑定,@RequestParam,还可以设置默认值与required属性,如下所示:

1 @RequestMapping(value="/paramBind")
2     public void paramBind(@RequestParam(value="userName",defaultValue="zhangsan",required=true) String userName) {
3         System.err.println("userName:" + userName);
4     }

     3.还支持REST风格,REST风格参数-1,如下所示

1 @RequestMapping(value="/rest1/{userName}",method = RequestMethod.GET)
2     public void rest1(@PathVariable String userName) {
3         System.err.println("userName:" + userName);
4     }

     4.REST风格参数-2,如下所示:

  

1 @RequestMapping(value="/rest2/{userName}",method = RequestMethod.GET)
2     public void rest2(@PathVariable("userName") String name) {
3         System.err.println("name:" + name);
4     }

    5.url中绑定多个参数,代码如下所示:

  

1 @RequestMapping(value="/multiParams/{userName1}/{userName2}",method = RequestMethod.GET)
2     public void multiParams(@PathVariable String userName1,@PathVariable String userName2) {
3         System.err.println("userName1:" + userName1 + ",userName2:" + userName2);
4     }

其中{userName1}/{userName2}之间的/也可以换成其它的合法符号。

    6.支持正则表达式,代码如下所示:

1 @RequestMapping(value="/regex/{userName:[a-z]+}.{age:[\\d]+}",method = RequestMethod.GET)
2     public void regex(@PathVariable String userName,@PathVariable int age) {
3         System.err.println("userName:" + userName + ",age:" + age);
4     }

其中只要userName为字母并且age为数字便可。

二、关于ThreadLocal

ThreadLocal是线程的局部变量,每个线程都有自己的局部变量,独立于变量的初始化副本,ThreadLocal接口主要有以下4个方法:

1、void set(T value):将此线程局部变量的当前线程副本中的值设置为指定值

2、T get():返回此线程局部变量的当前线程副本中的值

3、protected  T initialValue():返回此线程局部变量的当前线程的初始值

4、void remove():移除此线程局部变量的值。

关于为每个线程维护一个变量副本的实现思路:在ThreadLocal类中有一个ThreadLocalMap,其中键为线程对象,值为对应线程的变量副本。

三、DBCP、JNDI维护数据库连接池

在web应用中通常要对数据库连接池进行管理,一般用DBCP的多,下面主要根据自己理解的程度介绍一下:

1、DBCP:通常添加一个system.properties配置文件,设置数据源,如下:

#mysql datasource
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/novaframe
username=novaframe
password=novacloud
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=utf-8
defaultAutoCommit=true
defaultReadOnly=
defaultTransactionIsolation=READ_UNCOMMITTED

  然后便可以通过BasicDataSourceFactory.createDataSource(Properties p);获取数据源

2、JNDI:Java Naming and Directory Interface,Java命名和目录接口,是一组在Java应用中访问命名和目录服务的API

  命名服务:将名称和对象联系起来,可以用名称访问对象

  目录服务:一种命名服务,而且对象对象不但有名称,还有属性

 使用方法:在server.xml中设置数据源,以MySQL数据库为例,如下:在<GlobalNamingResources></GlobalNamingResources>节点中加入如下节点,

<Resource

name="jdbc/DBPool"

type="javax.sql.DataSource"

password="root"

driverClassName="com.mysql.jdbc.Driver"

maxIdle="2"

maxWait="5000"

username="root"

url="jdbc:mysql://127.0.0.1:3306/test"

maxActive="4"/>

  然后获取数据源方法:

Contextenv=null;
env=(Context)newInitialContext().lookup(" java:comp/env"); DataSource pool=(DataSource)env.lookup("jdbc/DBPool");

  有时也可以直接在system.properties中设置jndi name,然后直接

DataSource pool=(DataSource)env.lookup(jndi name);便可。

 

posted @ 2013-05-17 17:35  风儿飞  阅读(1595)  评论(0编辑  收藏  举报