javaWeb项目之新闻管理系统详细开发过程

一、写在前面

最近突然发现我写的一篇文章被很多人关注了,自己去看了一眼,是我很早以前自己学习Servlet时做的一个小系统,主要是为了好玩,没想到这个系统能帮助到一些学生学习java,所以我打算再出一个详细的教程。
前来咨询我的人基本都是大学未毕业的学生,想必应该是学习上遇到了一些问题,所以我打算从头到尾,详细的讲解这套系统的开发过程,目的是通过书面方式给一些存在疑问的同学提供一些教学帮助,欢迎留言咨询。

二、工程简介
以下是我个人对一个工程的理解:
在这里插入图片描述
三、搭建工程

1、new一个project。
在这里插入图片描述
这里选择javaEE下的web Application,然后下一步。

在这里插入图片描述
取一个项目名,然后完成。
在这里插入图片描述
2、搭建工程目录
创建好工程以后,先搭建工程目录,如下:
在这里插入图片描述
此处如果不能按照图片上的目录分级显示,可以点击小齿轮,然后点击图上标注的即可
在这里插入图片描述

3、导入jar包和c3p0文件
创建好工程目录后,我们现在就需要导入jar包和c3p0配置文件。
导jar包有两种方式,如图:
在这里插入图片描述
图片上的这个图标是导包的快捷方式,还有一种是在file下的project Structure也可导入,如图:
在这里插入图片描述
在Libraries下,点击加号,找到所有的jar包文件,引入。
在这里插入图片描述
将lib包fix进项目
在这里插入图片描述
然后应用,ok即可

c3p0代码如下(c3p0-config.xml)文件名必须叫这个,且必须放在src目录下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!--默认配置-->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/news?characterEncoding=utf-8</property>
        <property name="user">root</property>
        <property name="password">123456</property>
    </default-config>

</c3p0-config>

做好这些前期工作后,工程就算搭建完成了,接下来开始书写代码。

四、代码开发

1、设计数据表,因为自己做的是教学类代码,所以不做太多复杂的表,一共就两张表,如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据表设计好以后就可以写对应的javaBean文件了,就是实体类,代码如下:

package com.bean;

import java.sql.Date;

public class NewsComment {
    private int id;
    private int newsid;
    private String content;
    private String author;
    private Date createdate;

    @Override
    public String toString() {
        return  newsid +
                "," + content+
                "," + author+
                "," + createdate;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getNewsid() {
        return newsid;
    }

    public void setNewsid(int newsid) {
        this.newsid = newsid;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Date getCreatedate() {
        return createdate;
    }

    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }
}

package com.bean;

import java.sql.Date;

public class NewsDetail {
    private int id;
    private String title;
    private String summary;
    private String author;
    private Date createdate;
    public String toString1() {
        return title+
                "," + summary+
                "," + author +
                "," + createdate;
    }
    @Override
    public String toString() {
        return "NewsDetail{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", summary='" + summary + '\'' +
                ", author='" + author + '\'' +
                ", createdate=" + createdate +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Date getCreatedate() {
        return createdate;
    }

    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }
}

package com.bean;

import java.sql.Date;

public class PinLun {
private int id;
private Date createdate;

    public Date getCreatedate() {
        return createdate;
    }

    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private int newsid;

    @Override
    public String toString() {
        return content+
                "," + author;
    }

    public int getNewsid() {
        return newsid;
    }

    public void setNewsid(int newsid) {
        this.newsid = newsid;
    }

    private String content;
private String author;



    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }


}

```最后一个pageBean文件是做分页时需要的条件,不需要在数据库中创建实体类。

```java
package com.bean;

public class PageBean {
    private int currPage=1;
    private int totalPage;
    private int size=4;
    private int count;
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getCurrPage() {
        return currPage;
    }

    public void setCurrPage(int currPage) {
        this.currPage = currPage;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

}

这里呢,我们可以先配置一下tomcat
在这里插入图片描述
先将项目添加进来
在这里插入图片描述

在配置相关参数,应用就可以了
在这里插入图片描述
系统启动后会先访问首页,所以我们可以先做个漂亮的首页,也可以去网上找现成的,拿过来直接套用就可以了。
在这里插入图片描述
现在以管理为例,讲解整套servlet的开发流程。
前端页面路径代码

<li style="display:inline-block"><a href="/News/show" style="color: black">管理</a></li>

通过一个a标签,路径选取servlet的路径名,通过点击a标签,前端请求便会被web.xml拦截,通过名称找到相关的servlet,servlet通过取调存转四步,将请求响应给前端页面,完成整个步骤。了解思路,理论存在,实践开始。
首先配置web.xml:

<servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.news.web.ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>

这里一共分为两块,前面的<servlet></servlet>里面的内容,是servlet的路径,后面<servlet-mapping></servlet-mapping>里面的,则是配置的servlet的路径名
这里写好以后,咱们就可以去些servlet层的代码了:

public class ShowServlet extends HttpServlet {
    private PageBean page=new PageBean();//分页查询条件的对象
    private INewsService service=new NewsServiceImpl();//服务层对象
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
        Map<String, String[]> map = request.getParameterMap();
        page = JdbcUtil.mapToBean(map, PageBean.class);//调
        List<NewsDetail> list=service.selectLikePage (page);//调
        request.getSession().setAttribute("list",list);//存
        request.getSession().setAttribute("page",page);//存
        request.getRequestDispatcher("/jsp/show.jsp").forward(request,response);//转
    }

代码中相关功能已写了注释,这里再详细解释一下,servlet分get请求和post请求,通俗点讲,像平常某个超链接的跳转之类的就算是get请求,而登录注册之类的form表单提交的,就是post请求,举的例子不太恰当,仅作为理解的参考。
不管是哪种请求,都分为取、调、存、转四步,因为get请求中未添加参数,所以这里不需要“取”,通过调用JdbcUtil类的mapToBean方法获得数据,以及调用INewsService的selectLikePage 方法获取数据,这是“调”。request.getSession().setAttribute("list",list);//存 request.getSession().setAttribute("page",page);//存这两步则是“存”,即是将获取的数据存在request域中,通过request.getRequestDispatcher("/jsp/show.jsp").forward(request,response);//转转发,将数据响应给前端界面。

现在补充这里调用方法的代码:
JdbcUtil.java文件

 public static <T> T mapToBean(Map map, Class<T> c) {
        try {
            T t = c.newInstance();
            BeanUtils.populate(t, map);
            return t;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

INewsServiceImpl.java文件

public class NewsServiceImpl implements INewsService {
    private INewsDao dao=new NewsDaoImpl();

    @Override
    public List<NewsDetail> selectLikePage(PageBean page) {
        int count=dao.selectCount();
        int totalPage=(count%4==0)?(count/4):(count/4+1);
        page.setCount(count);
        page.setTotalPage(totalPage);
        return dao.selectLikePage(page);
    }

dao层NewsDaoImpl.java文件

public class NewsDaoImpl implements INewsDao {
    @Override
    public List<NewsDetail> selectLikePage(PageBean page) {
        QueryRunner qr = new QueryRunner(JdbcUtil.getDS());
        int startRow=(page.getCurrPage()-1)*page.getSize();
        String sql="select * from news_detail where 1=1";
        if(page.getTitle()!=null&&!page.getTitle().equals("")){
        sql+=" and title like '%"+page.getTitle()+"%'";
        }
        sql+=" limit ?,?";
        try {
            return qr.query(sql,new BeanListHandler<NewsDetail>(NewsDetail.class),startRow,page.getSize());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    }

实体类代码已经有了,就不多做描写了。
到这一步,请求的处理就算解决了,现在就是解决数据的响应了,因为servlet的最后一步是转,那跳转的页面就需要写一下了:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/6/6
  Time: 16:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>新闻管理系统</title>
    <script src="/js/jquery-3.3.1.min.js"></script>
</head>
<body>
<hr color="bisque">
<div>
    <div style="background-color: ghostwhite">
        <div style="width: 50px;float: left;margin: 15px auto auto 60px"><span style="font-family: kaiti;font-size: 25px;color: darkorchid">旧波新闻</span></div>
        <img src="img/bgimg2.jpg" alt="这是图片"  width="70" height="70" style="margin-left: 70px">
        <span style="color: blue;font-family: kaiti;font-size: 50px;margin-left: 140px">欢迎访问旧波新闻!</span>
        <div style="float: right;margin-right: 100px">
            <ul style="list-style-type: none">
                <li style="display:inline-block"><a href="/index.jsp" style="color: black">首页/</a></li>
                <li style="display:inline-block"><a href="login.jsp" style="color: black">登录/</a></li>
                <li style="display:inline-block"><a href="/show" style="color: black">管理</a></li>
            </ul>
        </div>
    </div>

    <h4 ><hr color="bisque"></h4>
    <div align="center">
        <form action="/show" method="post">
            <%--模糊查询区--%>
            新闻标题:<input type="text" name="title">
                <input type="hidden" name="currPage" value="1">
                <input type="submit" value="查询">
        </form>
        <div align="center">
            <table border="1" cellpadding="13" cellspacing="1">
                <tr>
                    <td>新闻编号</td>
                    <td>新闻标题</td>
                    <td>新闻摘要</td>
                    <td>作者</td>
                    <td>创建时间</td>
                    <td>操作</td>
                </tr>
                <c:forEach var="news" items="${sessionScope.list}">
                    <tr>
                        <td>${news.id}</td>
                        <td>${news.title}</td>
                        <td>${news.summary}</td>
                        <td>${news.author}</td>
                        <td>${news.createdate}</td>
                        <td><a href="/showPinLun?id=${news.id}">查看评论</a>||<a href="/addPinLun?id=${news.id}">评论</a>||<a onclick="return confirm('确认删除该评论吗?')" href="/del?id=${news.id}">删除</a></td>
                    </tr>
                </c:forEach>
            </table>
        </div>
        <div align="center" style="margin-top: 30px">
            <table cellspacing="1" cellpadding="10">
                <tr>
                    <td><a href="javascript:goPage(1)">首页</a></td>
                    <td><a href="javascript:goPage(${sessionScope.page.currPage-1})">上一页</a></td>
                    <td><c:forEach var="i" begin="1" end="${sessionScope.page.totalPage}"> <a href="javascript:goPage(${i})">${i}</a></c:forEach>
                    </td>
                    <td><a href="javascript:goPage(${sessionScope.page.currPage+1})">下一页</a></td>
                    <td><a href="javascript:goPage(${sessionScope.page.totalPage})">尾页</a></td>
                    <td>
                        跳转到
                        <input type="text" value="${sessionScope.page.currPage}" size="5"><input type="button" value="跳转" onclick="goPage(this.previousElementSibling.value)">
                    </td>
                </tr>
            </table>
        </div>
    </div>
</div>

</body>
<script>
    function goPage(v) {
        if(v<1){
            v=1;
        }
        var totalPage=${sessionScope.page.totalPage}
        if(v>totalPage){
            v=totalPage;
        }
        if(totalPage=0){
            v=1;
        }
        $(":hidden").val(v);
        $("form").submit();
    }
</script>
</html>

完成后的效果图展示:
在这里插入图片描述
一个新闻页显示的代码就算彻底结束了,如有不懂的,欢迎提问,或者添加我上一篇文章中的联系方式,如果想获取源代码,请前往上一篇文章JavaWeb项目之新闻管理系统

感谢您的阅读!

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜圈的小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值