前言
这篇博客是在看完了一篇黑马的文章之后突发奇想下来的。由于最近几天在学习框架的一些知识,对于javaweb中servlet有点忘记了,于是就有了这次的项目。看看自己对于Javaweb的三层架构还熟不熟悉。
任务
这次目的也是特别的简单,从数据库中把查询出来的信息,显示到浏览器上。
流程
1、搭建环境:
数据库使用的Mysql
导入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
由于项目较为简单,项目的环境差不多就完成了。当然有能力的同学可以把Mybatis整合进去,这样也并不麻烦。
2、编写操作数据库的工具包
-
首先在resouces目录下新建以的db.properties用来保存链接数据库的信息
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gb2312&useSSl=true username=root password=123456
-
现在就可以进行数据类的编写了
public class BaseDao{ private static String driver; private static String url; private static String username; private static String password; static { //通过类加载器读取资源 InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); } //获得数据库的链接 public static Connection getConnection(){ Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url,username,password); } catch (Exception e) { e.printStackTrace(); } return connection; } //编写查询公共类 public static ResultSet execute(Connection connection ,PreparedStatement preparedStatement, ResultSet resultSet,String sql,Object[] params) throws SQLException { preparedStatement = connection.prepareStatement(sql); for(int i = 0;i < params.length;i++) { preparedStatement.setObject(i+1,params[i]); } resultSet = preparedStatement.executeQuery(); return resultSet; } //释放资源 public static boolean closeResource(Connection connection,PreparedStatement preparedStatement, ResultSet resultSet ) { boolean flag = true; if(resultSet != null) { try { resultSet.close(); resultSet = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if(preparedStatement != null) { try { preparedStatement.close(); preparedStatement = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if(connection != null) { try { connection.close(); connection = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } return flag; } }
-
准备工作都干完了,现在开始正题,首先编写pojo实体类
public class User { private int id; private String name; private String password; public User() { } public User(int id, String name, String password) { this.id = id; this.name = name; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
-
编写dao层下的接口,并实现接口
public interface UserDao { public User selectUser (Connection connection) throws Exception; }
public class UserDaoImpl implements UserDao{ @Override public User selectUser(Connection connection) throws Exception { PreparedStatement pstat = null; ResultSet rs = null; User user = null; if(connection != null) { String id = "1"; String sql = "select * from user where id = ?"; Object[] params = {id}; rs = BaseDao.execute(connection, pstat, rs, sql, params); while(rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); } BaseDao.closeResource(null,pstat,rs); } return user; } }
-
进行业务层的编写
public interface UserService { public User getUser(); }
public class UserServiceImpl implements UserService{ private UserDao userDao; public UserServiceImpl() { this.userDao = new UserDaoImpl(); } @Override public User getUser() { Connection connection = null; User user = null; try { connection = BaseDao.getConnection(); user = userDao.selectUser(connection); } catch (Exception e) { e.printStackTrace(); }finally { BaseDao.closeResource(connection,null,null); } return user; } }
-
最后是servlet层的代码实现
public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { UserService userService = new UserServiceImpl(); User user = null; user = userService.getUser(); request.setAttribute("user",user); request.getRequestDispatcher("/index.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
注册servlet
<servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>com.feng.servlet.user.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping>
从代码可以知道最后是重定向到index.jsp中,因此在index.jsp中,我们需要取出数据,在这里我们采用的是EL表达式
用户id:${user.id}<br/>
用户名:${user.name }<br/>
密 码:${user.password }<br/>
最后附上一张成功的截图
Bug
这个项目虽然简单,但是也会冒出来一两个bug
- 在编写数据库工具类的时候,由于数据库工具类的编写错误,造成了500的报错。
- 可以看到的是,在这里没有出现乱码的问题,有可能大家写的时候会出先乱码,大家需要去手动的设置一下编码格式,或者写一个拦截器。
- 至于还有其他的一些bug那就暂时没有想到了,如果大家在练习的时候,出现了一些问题和bug,都可以贴出来,不经历bug怎么才能进步呢?
好吧,第一篇博客就写到这里了,也不知道对大家来说有用没用。对我来说,对于这块的知识重新梳理了一下。