项目大体是上博客系统,我们外化成了用来发布就业招聘信息的学校论坛。项目实现的功能如下:用户注册、用户登录、我的文章列表、添加我的文章、修改我的文章、删除我的文章、所有人文章列表、查看文章详情内容、文章访问量统计、文章点赞功能
前端:html写简单网页功能,css美化网页,JavaScript实现页面的动态效果和接口的调用
后端:Servlet,java
数据库:mysql
项目管理工具:maven
项目部署工具:tomcat、服务器
用户登录界面
所有文章列表界面(论坛首页)
查看文章详情界面(下方有访问量统计、点赞功能)
我的文章列表界面(有添加,删除,修改功能)
添加文章界面
修改文章界面
删除文章界面
1.根据功能分析,创建数据库表
用户表和文章表
用户表:id,用户名,密码,创建时间,修改时间,状态
文章表:id,创建时间,修改时间,标题,正文,用户id,状态,阅读量
(用用户表的id和文章表的用户id将两张表联系起来)
sql脚本
drop database if exists java17;
create database java17;
use java17;
drop table if exists userinfo;
create table userinfo(
id int primary key auto_increment,
username varchar(100) not null,
password varchar (32) not null,
create_time datetime default now(),
update_time datetime default now(),
`state` int default 1
);
drop table if exists articleinfo;
create table articleinfo(
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
create_time datetime default now(),
update_time datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
);
2.项目创建
创建一个webapp的maven项目;然后在maven仓库里搜索,添加Servlet引用;最后配置Servlet的配置文件web.xml
3.Servlet开发方式说明
前端页面在webapp目录下;
后端页面:
dao:数据持久层,和数据库进行交互
models:创建对象,和数据库表的属性保持一致
service:业务逻辑层,给前端直接提供接口的业务层
utils:封装的公共方法
用html,css构建简单的前端页面,根据JSON格式来进行前后端交互,所以说我们后端给前端返回的格式也必须是JSON格式
怎么简单返回一个JSON格式的数据?
使用Jaskson操作类(在maven仓库中搜索,然后添加),创建Jackson对象:ObjectMapper mapper=new ObjectMapper();
jQuery.getJSON("reg",{"username":username.val(),"password":password.val()},
function (data) {
if(data!=null && data.state==200){
alert("注册成功");
location.href="log.html";
}else{
alert("注册失败"+data.msg);
}
});
然后进行路由配置(或者使用注解方式)
<!-- 注册 -->
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>service.RegServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reg</servlet-name>
<url-pattern>/reg</url-pattern>
</servlet-mapping>
最后根据前端代码,完成后端逻辑代码的编写
后端代码分为三步:
public class RegServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
int state=-1;
String msg="";
if(username==null || password==null){
msg="参数不正确";
}else{
UserInfo userInfo=new UserInfo();
userInfo.setUsername(username);
userInfo.setPassword(password);
UserInfoDao userInfoDao=new UserInfoDao();
try {
boolean ret=userInfoDao.selectname(userInfo);
if(ret){
msg="用户已存在";
}else{
int res=userInfoDao.add(userInfo);
if(res>0){
state=200;
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
HashMap<String,Object> map=new HashMap<>();
map.put("state",state);
map.put("msg",msg);
WriteUtils.writeMap(response,map);
}
}
数据库操作就是写JDBC
public int add(UserInfo userInfo) throws SQLException {
int ret=0;
if(userInfo.getUsername()!=null && userInfo.getPassword()!=null){
Connection connection= DBUtils.getConnect();
String sql="insert into userinfo(username,password) values(?,?)";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,userInfo.getUsername());
statement.setString(2,userInfo.getPassword());
ret=statement.executeUpdate();
DBUtils.close(connection,statement,null);
}
return ret;
}
登录功能和注册功能非常类似,但是需要使用session,保存用户登录信息,主要是保存用户id
HttpSession session=request.getSession();
session.setAttribute("userinfo",userInfo);
展示用户自己的所有文章,即需要从session中获得用户id,也就是获得artilceinfo的uid来查找
//权限验证
HttpSession session=request.getSession(false);
if(session==null || session.getAttribute("userinfo")==null){
msg="用户未登录";
state=100;
}else{
//数据库查询
UserInfo userInfo=(UserInfo) session.getAttribute("userinfo");
int uid=userInfo.getId();
ArticleInfoDao articleInfoDao=new ArticleInfoDao();
try {
list=articleInfoDao.getArticleList(uid);
state=200;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
添加文章,只能是用户自己添加,所以也需要获取session信息,得到用户id,然后在文章表里添加内容
修改文章分为两部分:一是要先展示文章的详情内容,二是修改内容的接口
展示文章详情内容:根据文章id在数据库查询
修改文章内容接口:所有和用户自己有关的操作,都需要判断session信息,来验证用户是否登录,然后根据文章id修改内容
非常简单,根据文章id来删除就可以了
不需要验证信息,但是前端是写了有分页功能的,所有后端数据库操作要使用limit
String sql="select a.*,u.username from articleinfo a left join userinfo u on a.uid=u.id limit ?,?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,(cpage-1)*psize);
statement.setInt(2,psize);
和访问量功能相同