一、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个基本用法
- 基本用法,只有一个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);便可。