被搞了四天心态,终于把Servlet成功实现了,主要是jdbc没连接成功,问题在于jdbc版本最好和MySQL版本一致,整体流程是先写一个properties,里面写入连接jdbc的参数,如driver,url,username,password,然后写一个BaseDao的类,获取连接资源
private static String url=null;
private static String user=null;
private static String password =null;
// 获取连接资源
static{
try {
ResourceBundle bundle = ResourceBundle.getBundle("config");
String driver= bundle.getString("driver");
url = bundle.getString("url");
user=bundle.getString("user");
password=bundle.getString("password");
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
写一个内部类,实现连接和关闭流,两个方法可以单独写一套接口实现,
public interface Dao {
//获取连接
Connection getConn() throws Exception;
//关闭资源
void close (ResultSet rs,Statement st,Connection con) throws Exception;
}
自身写两个方法,调用内部类写的连接和关闭流的方法。
// 获取连接和关闭连接的方法,用内部类写的
public Connection getConn() throws Exception {
return new Inner().getConn();
}
public void close(ResultSet rs, Statement st, Connection con) {
new Inner().close(rs, st, con);
}
private class Inner implements Dao {
public Connection getConn() throws Exception {
return DriverManager.getConnection(url,user,password);
}
public void close(ResultSet rs, Statement st, Connection con)
{
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs=null;
}
if (st!=null) {
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
st=null;
}
if (con!=null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
con=null;
}
}
然后就获取数据库连接,获取数据,实现servlet转换成json串三步。
也是可以先写一套接口,然后实现方法体,开始写
public interface CityDao {
// 获取城市列表
public List<City> getCity();
}
先继承写的BaseDao,这是jdbc连接,可以直接调用连接方法,然后实现上面的获取列表城市的接口,返回的是一个城市的列表集合 ,数据库连接成功后执行查询语句,遍历获得的数据,new一个City对象,City对象是写好的,跟数据库数据字段一一对应,然后将获取的数据添加到城市集合里面,返回城市集合,最后关闭流。
public class cityDaoImpl extends BaseDao implements CityDao {
public List<City> getCity() {
Connection con=null;
Statement st=null;
ResultSet rs=null;
List<City> cities=null;
try {
con=getConn();
st=con.createStatement();
rs=st.executeQuery("SELECT*FROM test.provincial ORDER BY test.provincial.sortkey");
// 获取服务器关联数据库数据的城市
cities=new ArrayList<City>();
while(rs.next()){
City city=new City();
city.setId(rs.getString("pid"));
city.setName(rs.getString("Provincial"));
city.setSortKey(rs.getString("sortKey"));
cities.add(city);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
close(rs, st, con);
}
return cities;
}
}
先设置要展示页面的头部类型,以及编码格式,然后new 接口,右边填的参数是cityDaoimpl,然后调用获取城市的集合,返回的是城市集合对象,然后new一个RespObject,有数据填1,同时把集合放进该对象的dates里,该字段是Object,可以放入集合的,最后利用谷歌带的Gson,转换成json串,去web.xml映射servlet 就成功就数据库数据变成json串渲染到网页上面了。
public class CityServlet extends HttpServlet {
private static final long serialVersionUID=1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out= resp.getWriter();
CityDao dao=new cityDaoImpl();
// 获取数据库带有数据的城市
List<City> list=dao.getCity();
RespObject result=null;
if(list!=null&&list.size()>0){
// 正确返回并且带有数据
result= new RespObject(1,list);
}else{
result= new RespObject(0,"没有数据");
}
out.println(new GsonBuilder().create().toJson(result));
out.close();
out.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}