栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

WebExperiment-07

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

WebExperiment-07

Powered by:NEFU AB-IN

link

文章目录
  • WebExperiment-07
      • 需求
      • 项目结构
      • experiment7 第一部分解读
      • experiment7 第二部分解读
      • experiment7 第三部分解读

WebExperiment-07
  • 需求

    创建maven项目experiment-07
    声明项目打包类型,java版本,Servlet/JSTL/MySQL驱动/Annotation依赖,添加打包插件
    远程IP:xx.xx.xx.xx。视频Remote MySQL Connections

    • 基于idea database视图,个人学号/密码登录远程MySQL数据库
    • 在已经默认创建的以个人学号命名的数据库下,创建数据表user,添加id/name/inserttime数据段,并声明合适类型
    • inserttime段为时间戳类型,默认值为随段信息更新而自动更新
    • 添加若干测试数据记录

    在webapp下,创建meta-INF目录,直接复制context.xml资源配置文件,修改配置数据
    在com.entity下创建User实体类,声明id/name/insertTime等合适数据类型属性,对应数据库字段
    在com.util下,创建容器启动监听器DataSourceUtils,丛JNDI树获取DataSource对象,暴露连接对象获取方法
    创建全局过滤器,修改请求/响应编码,否则提交的数据会按ISO编码并保存在数据库

    需求+1
    在com.controller下,创建IndexServlet,重写doGet()方法。 基于JDBC查询全部用户信息,封装每一条记录为对象,创建集合封装对象,推送到index.jsp页面
    在/WEB-INF/jsp/下,创建index.jsp,基于JSTL标签,加载全部用户为列表
    页面声明动态获取部署路径,作为页面基本路径

    需求+1
    在index.jsp添加form表单,添加基于用户集合动态创建的下拉框;添加输入框
    在com.controller下,创建UpdateUserServlet类,接收用户ID与新用户名,通过JDBC修改指定ID的用户名
    并重定向回index,在Servlet中可通过req.getContextPath()方法,获取项目部署路径,拼接重定向地址(部署路径可能无法确定)

    需求+1
    在index.jsp用户名列表,添加跳转超链接 在com.controller下,创建GetUserServlet类,基于接收的用户ID,查询用户新建,封装。转发至query.jsp视图 创建query.jsp,显式用户详细信息

    运行部署项目至Tomcat,向index发起请求,查看结果,并测试功能

  • 项目结构

  • experiment7 第一部分解读

    首先创建User实体类

    package com.entity;
    
    import java.util.Date;
    
    
    public class User {
        private int id;
        private String name;
        private Date insertTime;
        private Date updateTime;
    
        public User() {
        }
        public User(int id, String name, Date insertTime, Date updateTime) {
            this.id = id;
            this.name = name;
            this.insertTime = insertTime;
            this.updateTime = updateTime;
        }
    
        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 Date getInsertTime() {
            return insertTime;
        }
    
        public void setInsertTime(Date insertTime) {
            this.insertTime = insertTime;
        }
    
        public Date getUpdateTime() {
            return updateTime;
        }
    
        public void setUpdateTime(Date updateTime) {
            this.updateTime = updateTime;
        }
    }
    
    

    之后配置数据库的两个文件,即配置DataSource接口

    • DataSourceUtils.java

    • context.xml

      项目只要声明了context.xml配置文件,Servlet容器(Tomcat)启动时,就基于此配置连接数据库,创建数据源对象。

  • experiment7 第二部分解读

    先编写过滤器

    EncodingFilter

    目的:将所有页面的编码改成UTF-8

    package com.filter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    
    @WebFilter("
    @WebServlet("/index")
    public class IndexServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            List users = new ArrayList<>();
            String sql = "select * from user";
            try(Connection conn = DataSourceUtils.getConnection();
                PreparedStatement st = conn.prepareStatement(sql);
                ResultSet rs = st.executeQuery()){
                while (rs.next()) {
                    User user = new User(rs.getInt("id"),
                            rs.getString("name"),
                            rs.getTimestamp("insert_time"),
                            rs.getTimestamp("update_time"));
                    users.add(user);
                }
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
            req.setAttribute("users", users);
            req.getRequestDispatcher("/WEB-INF/jsp/index.jsp")
                    .forward(req, resp);
        }
    }
    
    

    这里就用到了和数据库进行交互的知识,从表user中获取所有的对象,这里会用到比较固定的三条语句

    • Connection conn = DataSourceUtils.getConnection();

      意思就是通过暴露的connection对象方法,对数据库进行连接

    • PreparedStatement st = conn.prepareStatement(sql);

      获取执行sql的对象,即处理sql语句

      比如

      • String sql = "select * from user";

      • String sql = "update user set name = ? where id = ?",这里的"?"就代表后面要设置的参数,第一个问号的下标就是1

        后面就会进行

        st.setString(1, newName);
        st.setInt(2, id);
        st.executeUpdate();
        

        注意! 如果像update, insert这种没有返回结果集的操作,一定不要忘了最后一句话执行!

    • ResultSet rs = st.executeQuery();

      像这种有结果集的,就要进行获取

  • experiment7 第三部分解读

    接下来编写查询板块的servlet(查询的表单在index.jsp中提交了)

    UpdateUserServlet

    目的:处理index.jsp中提交的表单,通过数据库将对象的名字修改成传过来的新名字

    package com.controller;
    
    import com.entity.User;
    import com.util.DataSourceUtils;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import static java.lang.Integer.parseInt;
    
    
    @WebServlet("/update")
    public class UpdateUserServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String newName = req.getParameter("name");
            int id = parseInt(req.getParameter("uid"));
            String sql = "update user set name = ? where id = ?";
            try (Connection conn = DataSourceUtils.getConnection();
                 PreparedStatement st = conn.prepareStatement(sql)) {
                st.setString(1, newName);
                st.setInt(2, id);
                st.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            resp.sendRedirect(req.getContextPath() + "/index");
        }
    }
    
    

    编写查询的jsp

    query

    <%@ page pageEncoding="UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    
    
        
        query
    
    
    ${user.id }
    ${user.name }
    ${user.insertTime }
    ${user.updateTime }

    编写对应的servlet

    GetUserServlet

    目的: 接收index.jsp传的uid参数,通过uid在数据库中找到对应的对象,将对象的信息转发给query.jsp

    package com.controller;
    
    import com.entity.User;
    import com.util.DataSourceUtils;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import static java.lang.Integer.parseInt;
    
    
    @WebServlet("/getuser")
    public class GetUserServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            User user = null;
            int uid = parseInt(req.getParameter("uid"));
            String sql = "select * from user where id=?";
            try (Connection conn = DataSourceUtils.getConnection();
                 PreparedStatement st = conn.prepareStatement(sql)) {
                st.setInt(1, uid);
                try (ResultSet rs = st.executeQuery()) {
                    while (rs.next()) {
                        user = new User();
                        user.setId(rs.getInt("id"));
                        user.setName(rs.getString("name"));
                        user.setInsertTime(rs.getTimestamp("insert_time"));
                        user.setUpdateTime(rs.getTimestamp("update_time"));
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            req.setAttribute("user", user);
            req.getRequestDispatcher("/WEB-INF/jsp/query.jsp")
                    .forward(req, resp);
        }
    }
    
    
    • st.setInt(1, uid);

      id是可以按string传递的,可自动转换匹配,也就是也可以

      st.setString(1, req.getParameter("uid"));

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号