一个简单的Javaweb小demo

这篇博客记录了一次复习JavaWeb的过程,通过创建一个简单的项目,从数据库获取数据并显示到页面上。作者首先配置了Mysql、Servlet等依赖,然后编写了数据库连接工具类、POJO实体、DAO接口及实现、业务层接口及实现,最后在Servlet中处理请求并将数据转发到JSP页面。项目中遇到了500错误,但最终成功展示了数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这篇博客是在看完了一篇黑马的文章之后突发奇想下来的。由于最近几天在学习框架的一些知识,对于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、编写操作数据库的工具包

  1. 首先在resouces目录下新建以的db.properties用来保存链接数据库的信息

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gb2312&useSSl=true
    username=root
    password=123456
    
  2. 现在就可以进行数据类的编写了

    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;
    
        }
    }
    
  3. 准备工作都干完了,现在开始正题,首先编写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 + '\'' +
                    '}';
        }
    }
    
  4. 编写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;
        }
    }
    
  5. 进行业务层的编写

    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;
        }
    }
    
  6. 最后是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);
        }
    }
    
  7. 注册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/>

最后附上一张成功的截图

image-20210115184957341

Bug

这个项目虽然简单,但是也会冒出来一两个bug

  1. 在编写数据库工具类的时候,由于数据库工具类的编写错误,造成了500的报错。
  2. 可以看到的是,在这里没有出现乱码的问题,有可能大家写的时候会出先乱码,大家需要去手动的设置一下编码格式,或者写一个拦截器。
  3. 至于还有其他的一些bug那就暂时没有想到了,如果大家在练习的时候,出现了一些问题和bug,都可以贴出来,不经历bug怎么才能进步呢?

好吧,第一篇博客就写到这里了,也不知道对大家来说有用没用。对我来说,对于这块的知识重新梳理了一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值