最近在学习JNDI,今天整出来一个demo,拿出来大家分享下。
先上一个项目结构的截图:
1、配置JNDI数据源
首先,修改一下tomcat的配置文件conf/context.xml
在Context属性中加入
<Resource name="jndi-web" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:orcl" username="scott" password="tigger" maxIdle="40" maxWait="4000" maxActive="250" removeAbandoned="true" removeAbandonedTimeout="100" logAbandoned="true" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />
其次,项目中的web.xml中加入
<resource-ref> <description>DB Connection</description> <res-ref-name>jndi-web</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
最后,就是在spring的配置文件applicationContext.xml中加入
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jndi-web</value> </property> </bean>
到这里,JNDI的配置就算是结束了。注意:上面3个配置文件中都用到了“jndi-web”的名称,请保持一致性。
2、SpringMVC的配置
首先,在项目中的web.xml文件中加入
<servlet> <servlet-name>test</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
其次,加入controller代码<HelloController.java>:
package com.blanddrift.controller; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import com.blanddrift.util.DataBaseUtil; public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { Connection conn = DataBaseUtil.getConn(); List<Map<String, String>> list = new ArrayList<Map<String,String>>(); try { Statement stt = conn.createStatement(); ResultSet rs = stt.executeQuery("select * from emp"); while(rs.next()) { Map<String, String> map = new HashMap<String, String>(); map.put("empno", rs.getString(1)); map.put("ename", rs.getString(2)); map.put("job", rs.getString(3)); map.put("mgr", rs.getString(4)); map.put("hiredate", rs.getString(5)); map.put("sal", rs.getString(6)); map.put("comm", rs.getString(7)); map.put("deptno", rs.getString(8)); list.add(map); } req.setAttribute("emp", list); } catch (Exception e) { e.printStackTrace(); } finally { DataBaseUtil.closeConn(conn); } req.setAttribute("hello", "Welcome to spring!!!"); return new ModelAndView("welcome"); } }
上面用到一个的DataBaseUtil的代码如下<DataBaseUtil.java>:
package com.blanddrift.util; import java.sql.Connection; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class DataBaseUtil { private static DataSource ds; static { try { Context ctx = new InitialContext(); ds = (DataSource) ctx.lookup("java:comp/env/jndi-web"); } catch (NamingException e) { e.printStackTrace(); } } private DataBaseUtil(){} public synchronized static Connection getConn(){ try { return ds.getConnection() != null ? ds.getConnection() : null; } catch (SQLException e) { e.printStackTrace(); } return null; } public static void closeConn(Connection conn) { try{ if(conn != null) { conn.close(); conn = null; } } catch (Exception e) { e.printStackTrace(); } } }
最后,在WEB-INF下新建test-servlet.xml的配置文件(文件名称为web.xml中的<servlet-name>属性 + “-servlet.xml”),文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!--缺省映射处理器,不需要明确声明,但声明后就非常清楚使用的是哪个映射处理器 --> <bean id="beanNameUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> </bean> <!-- 这里的name属性有两个职责,既定义Bean的名字,也定义需要这个控制器处理的URL样式 --> <bean name="/hello.do" class="com.blanddrift.controller.HelloController"> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
根据test-servlet.xml的配置文件可以知道我们需要编写的jsp文件,即/WEB-INF/jsp/welcome.jsp,下面提供welcome.jsp的代码:
<%@page import="java.util.Map"%> <%@page import="java.util.List"%> <%@ page contentType="text/html; charset=UTF-8"%> <%@ page isELIgnored="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Hello World!</title> </head> <body> <h2> This is a note which come from Java !!! </h2> <h3> ${hello } </h3> <table border="1" cellpadding="0" cellspacing="0"> <tr> <td>empno</td> <td>ename</td> <td>job</td> <td>mgr</td> <td>hiredate</td> <td>sal</td> <td>comm</td> <td>deptno</td> </tr> <% List<Map<String, String>> list = (List<Map<String, String>>)request.getAttribute("emp"); for(int i = 0; i < list.size(); i++) { Map<String, String> map = list.get(i); %> <tr> <td><%=map.get("empno")%></td> <td><%=map.get("ename")%></td> <td><%=map.get("job")%></td> <td><%=map.get("mgr")%></td> <td><%=map.get("hiredate")%></td> <td><%=map.get("sal")%></td> <td><%=map.get("comm")%></td> <td><%=map.get("deptno")%></td> </tr> <% } %> </table> </body> </html>
3、部署工程,启动刚才修改过context.xml文件的tomcat,访问http://localhost:8080/jndi-web/hello.do,就会得到下面的页面:
项目的war包:jndi-web.zip