您的位置:首页 > 编程语言 > Java开发

(上节)Spring+JDBC+Struts;实现图片上传;配置的属性默认dbc用单例模式,action一定要scope=“prototype”

2014-03-10 21:00 891 查看
web.xml的配置

<!--告诉前台要调用spring框架 -->

  <context-param>

  <para-name>contextConfigLocation</para-name>

  <!-- 注意寻找文件实际路径是在classes下,因为生成在那 -->

  <param-value>/WEB-INF/classes/applicationContext.xml</param-value>

  </context-param>

  <!-- 告诉spring要监听 -->

  <listener>

  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

  

将项目部署,并启动服务器,如果看到启动时,提示加载了配置文件,就表示配置成功。

信息: Initializing Spring root WebApplicationContext
准备工作做完,开始书写操作代码

数据库连接一般情况

《自己创建连接类,然后再applicationContext.xml中配置属性的值》

public
class
DataBaseConnection {
 
    private String
dbdriver;
    private String
dburl;
    private String
username;
    private String
password;
    private Connection
conn; 
    public Connection getConnection() {
       try {
           if (conn ==
null ||
conn.isClosed()) {
              Class.forName(dbdriver);
              conn = DriverManager.getConnection(dburl,
username, password);
           }
        } catch (Exception e) {
           e.printStackTrace();
       }
       return
conn;
    } 
    public
void
close() {
       if (conn !=
null) {
           try {
              conn.close();
           } catch (Exception e) {
              e.printStackTrace();
           }
       }
    } 
    public
void
setDbdriver(String dbdriver) {
       this.dbdriver = dbdriver;
    } 
    public
void
setDburl(String dburl) {
       this.dburl = dburl;
    } 
    public
void
setUsername(String username) {
       this.username = username;
    }
 
    public
void
setPassword(String password) {
       this.password = password;
    } 
}

<bean
id="dataBaseConnection"class="org.liky.dbc.DataBaseConnection">
       <property
name="dbdriver"value="oracle.jdbc.driver.OracleDriver"></property>
       <property
name="dburl"value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>
       <property
name="username"value="SUNXUN"></property>
       <property
name="password"value="123"></property>
    </bean>
《我们采用接下来的方式,直接调用spring提供连接配置,不用去getConnection,这样我们dao对数据的操作也必须要换成spring帮我们封装好的操作方法》数据库连接属性更适合放在xml中,便于维护,因为交付用户(不交源码),java代码是被编译成classes中

applicationContext.xml的配置,注意这里的id,name都是spring里对应的,不要改

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>
<property name="username" value="SUNXUN"></property>
<property name="password" value="123"></property>
</bean>

dao层公共接口

package com.kane.dao;

import java.util.List;

/**

 * 公共接口

 * @author lenovo

 *

 * @param <K>key类型

 * @param <V>实体类型

 */

public interface IDAO <K,V>{
public void docreate(V v)throws Exception;
public void doremove(K id)throws Exception;
public void update(V v)throws Exception;
public List<V> findAll ()throws Exception;
public V findById(K id)throws Exception;
/**

* @param pageNo
* @param pageSize
* @param column对哪个列进行模糊查询
* @param keyword
* @return
* @throws Exception
*/
public List<V> findByPage(int pageNo,int pageSize,String column,String keyword)throws Exception;

public int getCount(String column,String keyword)throws Exception;

}

DAOIMPL

package com.kane.dao.Impl;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import org.springframework.jdbc.core.RowMapper;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

import com.kane.dao.IProduct;

import com.kane.vo.Product;

/**

 * JdbcDaoSupport:因为用的spring提供的操作方法,虽说配置了,但是这里调用的方法需要继承

 * @author kane

 *RowMapper<Product>:为了将一行数据转换成Product对象

 */

public class ProductImpl extends JdbcDaoSupport implements IProduct,RowMapper<Product> {

public void docreate(Product v) throws Exception {
String sql="INSERT INTO Product VALUES(emp_sequence.nextVal,?,?,?,?,?,?,?)";
//super.getConnection();不推荐使用,spring不帮我们关闭连接
super.getJdbcTemplate().update(sql,v.getName(),v.getDescription(),v.getBaseprice(),v.getWriter()
,v.getPublish(),v.getPages(),v.getImages());
}

public void doremove(String id) throws Exception {
// TODO Auto-generated method stub

}

public List<Product> findAll() throws Exception {
// TODO Auto-generated method stub
return null;
}

public Product findById(String id) throws Exception {
// TODO Auto-generated method stub
return null;
}

public List<Product> findByPage(int pageNo, int pageSize, String column,
String keyword) throws Exception {
String sql="SELECT * FROM (SELECT productid,name,description,baseprice,writer,publish,pages,images ROWNUM rn FROM Product WHERE "+column
+" LIKE ? AND ROWNUM<=?) temp WHERE temp.rn>?";
List<Product> allList=super.getJdbcTemplate().query(sql, this,"%"+keyword+"%",pageNo*pageSize,(pageNo-1)*pageSize);
return allList;
}

public int getCount(String column, String keyword) throws Exception {
String sql="SELECT COUNT(*) FROM Product WHERE "+column
+" LIKE ?";
int count=super.getJdbcTemplate().queryForInt(sql, this,"%"+keyword+"%");
return count;
}

public void update(Product v) throws Exception {
// TODO Auto-generated method stub

}

public Product mapRow(ResultSet rs, int arg1) throws SQLException {
Product product=new Product();
product.setProductid(rs.getString("productid"));
product.setName(rs.getString("name"));
product.setBaseprice(rs.getDouble("baseprice"));
product.setDescription(rs.getString("description"));
product.setWriter(rs.getString("writer"));
product.setPublish(rs.getString("publish"));
product.setPages(rs.getInt("pages"));
product.setImages(rs.getString("pages"));
//这里第二个参数设置哪些行返回对象,我们都返回对象,所以不用设置
return product;
}

}

IOC:控制反转机制,主要用于代替工厂类

AOP:面向切面:不修改原代码,为项目加入或删除功能。过滤器,在前后台之间竖直插入;Spring AOP主要实现动态代理

代理类基本负责预处理和关连接

serviceImpl

package com.kane.service.Impl;

import java.util.HashMap;

import java.util.Map;

import com.kane.dao.IProduct;

import com.kane.service.IProductService;

import com.kane.vo.Product;

/**

 * 这里我们要用到面向切面的技术,动态代理,实现统一的预处理和关闭连接

 * @author kane

 *

 */

public class ProductServiceImpl implements IProductService {
//因为spring机制帮忙关闭连接,所以代码量减少了,但是配置不减
private IProduct productdao;//这里工厂类用IOC配置取代

public IProduct getProductdao() {
return productdao;
}

public void setProductdao(IProduct productdao) {
this.productdao = productdao;
}

public void delete(String id) throws Exception {
productdao.doremove(id);
}

public Map<String, Object> findAll(int pageNo, int pageSize, String column,
String keyword) throws Exception {
Map<String,Object> map=new HashMap<String, Object>();
map.put("allProduct",productdao.findByPage(pageNo, pageSize, column, keyword));
map.put("allCount", productdao.getCount(column, keyword));
return map;
}

public Product findById(String id) throws Exception {
// TODO Auto-generated method stub
return null;
}

public void insert(Product product) throws Exception {
productdao.docreate(product);
}

public void update(Product product) throws Exception {
productdao.update(product);
}

}

在进行测试页面前,当然少不了测试类

package com.kane.pro;

import static org.junit.Assert.*;

import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.kane.service.IProductService;
import com.kane.vo.Product;

public class test {
//配置文件中读取,不用工厂类
private IProductService productServiceImpl;

//每个方法都要调用的初始方法
@Before
public void init() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
productServiceImpl = (IProductService) ctx.getBean("productServiceImpl");
}

@Test
public void testDelete() {
fail("Not yet implemented");
}

@Test
public void testFindAll() throws Exception {
Map<String,Object> map=productServiceImpl.findAll(1,3,"name","精通");
List<Product> list=(List<Product>)map.get("allProduct");
System.out.println(list.get(0).getName());
}

@Test
public void testFindById() {

}

@Test
public void testInsert() {
fail("Not yet implemented");
}

@Test
public void testUpdate() {
fail("Not yet implemented");
}

}






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: