大二上学期第六次课后作业--- 数据源、JavaBean与MVC模式

数据源、JavaBean与MVC模式

练习1、使用连接池实现数据库连接
训练要点:
连接池的配置
通过JNDI查找数据源
需求说明:
通过连接池方式访问数据库
实现思路及关键代码:
配置context.xml文件
配置web.xml文件
编码实现查找数据源获取连接


1.在web目录里创建META-INF子目录,在里面创建数据源配置文件context.xml
在这里插入图片描述
在这里插入图片描述
2.在src里创建net.hw.dbutil包,在里面创建ConnectionManager类
在这里插入图片描述

package net.hw.dbutil;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * 功能:数据库连接管理类
 */
public class ConnectionManager {
    /**
     * 私有化构造方法,拒绝实例化
     */
    private ConnectionManager() {
    }

    /**
     * 获取数据库连接静态方法
     *
     * @return
     */
    public static Connection getConnection() {
        // 定义数据库连接
        Connection conn = null;

        try {
            // 初始化上下文
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/news");
            conn = ds.getConnection();
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 返回数据库连接
        return conn;
    }
    public static void closeConn(Connection conn) {
        // 判断数据库连接是否为空
        if (conn != null) {
            // 判断数据库连接是否关闭
            try {
                if (!conn.isClosed()) {
                    // 关闭数据库连接
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Connection conn = getConnection();
        if (conn != null ) {
            System.out.println("恭喜,数据库连接成功!");
        } else {
            System.out.println("遗憾,数据库连接失败!");
        }
        // 关闭数据库连接
        closeConn(conn);
    }
}

这里的项目还是第五周的那个项目,现在修改成了JNDI的方式,现在来启动服务看看
在这里插入图片描述
进入首页了,说明连接成功!

练习2、实现首页新闻列表显示
实现思路:
编写业务Bean实现新闻查询的方法
在JSP页面中调用JavaBean的方法

1.编写新闻实体类

package net.hw.bean;

/**
 * 新闻的实体类
 */
public class News {
    private int ntid;
    private String ntitle;
    private String nauthor;
    private String ncontent;

    public int getNtid() {
        return ntid;
    }

    public void setNtid(int ntid) {
        this.ntid = ntid;
    }

    public String getNtitle() {
        return ntitle;
    }

    public void setNtitle(String ntitle) {
        this.ntitle = ntitle;
    }

    public String getNauthor() {
        return nauthor;
    }

    public void setNauthor(String nauthor) {
        this.nauthor = nauthor;
    }

    public String getNcontent() {
        return ncontent;
    }

    public void setNcontent(String ncontent) {
        this.ncontent = ncontent;
    }

    @Override
    public String toString() {
        return "News{" +
                "ntid=" + ntid +
                ", ntitle='" + ntitle + '\'' +
                ", nauthor='" + nauthor + '\'' +
                ", ncontent='" + ncontent + '\'' +
                '}';
    }
}

2.创建NewsDao数据访问接口
在这里插入图片描述
3.新闻数据访问接口实现类

package net.hw.dao.impl;

import net.hw.bean.News;
import net.hw.dao.NewsDao;
import net.hw.dbutil.ConnectionManager;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class NewsDaoImpl implements NewsDao {
    @Override
    public int insert(News news) {
        //定义插入记录数
        int count = 0;
        // 获得数据库连接
        Connection conn = ConnectionManager.getConnection();
        // 定义SQL字符串
        String strSQL = "INSERT INTO news (ntid,ntitle,nauthor,ncontent) VALUES (?,?,?,?)";
        try {
            // 创建预备语句对象
            PreparedStatement pstmt = conn.prepareStatement(strSQL);
            // 设置占位符的值
            pstmt.setInt(1,news.getNtid() );
            pstmt.setString(2,news.getNtitle());
            pstmt.setString(3,news.getNauthor());
            pstmt.setString(4,news.getNcontent());
            // 执行更新操作,插入新录
            count = pstmt.executeUpdate();
            // 关闭预备语句对象
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            ConnectionManager.closeConn(conn);
        }

        // 返回插入记录数
        return count;
    }

    @Override
    public List<News> findAll() {
        // 声明类别列表
        List<News> newss = new ArrayList<News>();
        // 获取数据库连接对象
        Connection conn = ConnectionManager.getConnection();
        // 定义SQL字符串
        String strSQL = "SELECT * FROM news";
        try {
            // 创建语句对象
            Statement stmt = conn.createStatement();
            // 执行SQL,返回结果集
            ResultSet rs = stmt.executeQuery(strSQL);
            // 遍历结果集
            while (rs.next()) {
                // 创建类别实体
                News news = new News();
                // 设置实体属性
                news.setNtid(rs.getInt("ntid"));
                news.setNtitle(rs.getString("ntitle"));
                news.setNauthor(rs.getString("nauthor"));
                news.setNcontent(rs.getString("ncontent"));

                // 将实体添加到类别列表
                newss.add(news);
            }
            // 关闭结果集
            rs.close();
            // 关闭语句对象
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭数据库连接
            ConnectionManager.closeConn(conn);
        }
        // 返回类别列表
        return newss;
    }
}

创建NewsServlet

package net.hw.servlet;

import net.hw.bean.News;
import net.hw.dao.impl.NewsDaoImpl;

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@WebServlet("/news")
public class NewsServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.doPost(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建新闻对象
        NewsDaoImpl newsDao = new NewsDaoImpl();
        // 获取全部新闻
        List<News> newss = newsDao.findAll();
        // 获取session对象
        HttpSession session = request.getSession();
        // 把新闻列表以属性的方式保存到session里
        session.setAttribute("news", newss);
        // 重定向到显示新闻页面(showNews.jsp)
        response.sendRedirect(request.getContextPath() + "/showNews.jsp");
        // 在服务器控制台输出测试信息
        for (News news:newss) {
            System.out.println(news);
        }
    }
}

最后创建showNews.jsp页面

<%@ page import="net.hw.bean.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>新闻列表</title>
</head>
<body>
<%
    User user = (User) session.getAttribute("LOGINED_USER");
    if (user == null) {
        // 在session里创建errMsg属性
        session.setAttribute("errMsg", "要访问新闻列表页面,请先登录");
        // 采用重定向,跳转到登录页面
        response.sendRedirect("login.jsp");
    } else if (!session.getAttribute("username").equals("admin")) {
        session.setAttribute("Msg", "您不是管理员无法访问新闻列表页面");
        response.sendRedirect("index.jsp");
    } else {
        // 删除session里的errMsg属性
        if (session.getAttribute("errMsg") != null) {
            session.removeAttribute("errMsg");
        }
        if (session.getAttribute("Msg") != null) {
            session.removeAttribute("Msg");
        }
    }
%>
<div>
    登录用户:<span style="color: red;">${username}</span>
    <c:forEach var="i" begin="1" end="5">
    </c:forEach>
</div>
<div class="title">
    <h3>新闻列表</h3>
</div>
<div class="main">
    <table>
        <tr>
            <th>新闻编号</th>
            <th>新闻标题</th>
        </tr>
        <c:forEach var="news" items="${news}">
            <tr align='center'>
                <td>${news.ntid}</td>
                <td width="500">
                    <a href="">${news.ntitle}</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</div>
<%
    String errMsg = (String) session.getAttribute("errMsg");
    if (errMsg != null) {
//        errMsg = new String(errMsg.getBytes("ISO-8859-1"), "utf-8");
        out.println("<script>alert('" + errMsg + "')</script>");
    }

    String Msg = (String) session.getAttribute("Msg");
    if (Msg != null) {
//        errMsg = new String(errMsg.getBytes("ISO-8859-1"), "utf-8");
        out.println("<script>alert('" + Msg + "')</script>");
    }
%>
</body>
</html>

启动服务,看看结果
在这里插入图片描述

练习3、实现读取单条新闻
需求说明:
根据新闻编号读取单条新闻并显示
实现思路:
获取新闻的编号
编写按照编号查询新闻的方法
在JSP页面中调用查询方法


1.我们是按照nid来查询,所以需要在News实体中添加nid这个属性
在这里插入图片描述
在这里插入图片描述
在NewsDao中和NewsDaoImpl中编写按新闻编号来查询新闻并显示

练习4、实现对新闻发表评论
需求说明:
浏览新闻时可以对新闻发表评论

练习5、实现对新闻发表评论
实现思路:
浏览用户如果以匿名方式发表评论,则默认用户名为“这家伙很懒什么也没留下”
使用request对象的getRemoteAddr( )方法记录用户的IP地址
编写添加评论的方法,实现评论的添加
添加评论后返回新闻浏览页面,显示已添加的评论

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值