一、写在前面
最近突然发现我写的一篇文章被很多人关注了,自己去看了一眼,是我很早以前自己学习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项目之新闻管理系统
感谢您的阅读!