·一.登录模块开发
1.创建了一个用户信息实体类(数据表的字段)
2.开发了Dao层:创建了一个接口,接口中有一个方法
//登录的方法
public User login(String username) throws Exception;
3.开发了Dao层的实现层,创建了一个类,实现了Dao层接口,重写了login方法
@Override
public User login(String username) throws Exception {
User user=null;
//步骤一:创建一条SQL
String sql="select * from news_users where uname=?";
//步骤二:执行SQL并且接受返回值
ResultSet rs = executeQuery(sql, username);
//步骤三:将返回值装配到实体对象当中
if(rs!=null) {
while(rs.next()) {
user=new User();
user.setUid(rs.getInt("uid"));
user.setUname(rs.getString("uname"));
user.setUpwd(rs.getString("upwd"));
}
}
return user;
}
4.开发Service层,创建一个接口,接口中有一个login方法,
public interface IUserInfoService {
//登录的方法
public User login(String username,String password) throws Exception;
}
5.开发Service的实现类,创建了一个类,这个类实现了Service接口,重写了login方法,方法中主要将dao层拿到的数据跟用户输入的数据做比较
public class IUserInfoServiceImpl implements IUserInfoService{
//植入Dao层对象
private IUserInfoDao userinfoDao=new IUserInfoDaoImpl();
@Override
public User login(String username, String password) throws Exception {
//执行login方法,从数据库中拿出当前查询到的user数据
User user = userinfoDao.login(username);
//先判断从dao层接收过来的user对象是否为空,在不是空的情况下,用实体中存放的数据跟用户输入的数据做对比
if(user!=null&&user.getUpwd().equals(password)) {
return user;
}
return null;
}
1.创建了一个用户信息实体类(数据表的字段)
2.开发了Dao层:创建了一个接口,接口中有一个方法
//登录的方法
public User login(String username) throws Exception;
3.开发了Dao层的实现层,创建了一个类,实现了Dao层接口,重写了login方法
@Override
public User login(String username) throws Exception {
User user=null;
//步骤一:创建一条SQL
String sql="select * from news_users where uname=?";
//步骤二:执行SQL并且接受返回值
ResultSet rs = executeQuery(sql, username);
//步骤三:将返回值装配到实体对象当中
if(rs!=null) {
while(rs.next()) {
user=new User();
user.setUid(rs.getInt("uid"));
user.setUname(rs.getString("uname"));
user.setUpwd(rs.getString("upwd"));
}
}
return user;
}
4.开发Service层,创建一个接口,接口中有一个login方法,
public interface IUserInfoService {
//登录的方法
public User login(String username,String password) throws Exception;
}
5.开发Service的实现类,创建了一个类,这个类实现了Service接口,重写了login方法,方法中主要将dao层拿到的数据跟用户输入的数据做比较
public class IUserInfoServiceImpl implements IUserInfoService{
//植入Dao层对象
private IUserInfoDao userinfoDao=new IUserInfoDaoImpl();
@Override
public User login(String username, String password) throws Exception {
//执行login方法,从数据库中拿出当前查询到的user数据
User user = userinfoDao.login(username);
//先判断从dao层接收过来的user对象是否为空,在不是空的情况下,用实体中存放的数据跟用户输入的数据做对比
if(user!=null&&user.getUpwd().equals(password)) {
return user;
}
return null;
}
}
6.开发Servlet层,创建了一个类,这个类继承了HttpServlet抽象类,重写了doGet()和doPost()方法,在doGet()中调用doPost(),内部实现逻辑如下:
6.1从前台能够接受到用户提交的用户名和密码
6.2调用service层的login方法执行登录操作
6.3接收方法的返回值,判断返回值是否为空,如果为空则代表登录失败,跳转到Login.jsp,如果不为空,将用户信息保存到session对象当中,并且跳转到首页
二.非法路径拦截(没有登录的用户无法进行后台操作)
在需要拦截的页面中加入如下代码(判断session对象当中是否有用户登录的信息,如果没有则跳转到登录页面)
<%
//获取Session的存储的登录信息
User user=(User)session.getAttribute("user");
if(user==null){
response.sendRedirect("page/login/login.jsp");
}
%>
三.退出系统
在Servlet当中加上对应模块的代码,用了一个action地址区分不同的功能
if(action.equals("logOut")) {
//清空Session
req.getSession().removeAttribute("user");
resp.sendRedirect("/NewsManager");
}
<a href="<%=basePath %>IUserInfoServlet?action=logOut" class="signOut"><i class="seraph icon-tuichu"></i><cite>退出</cite></a>
四.新闻列表
1.开发Dao层,创建一个Dao层接口,在接口中添加一个查询所有新闻的方法
public interface INewsDao {
//查询所有新闻的方法
public List<News> getAllNews() throws Exception;
}
2.创建Dao层实现类,创建一个类,实现Dao层接口,然后执行数据库查询操作
@Override
public List<News> getAllNews() throws Exception {
List<News> newsList=new ArrayList<News>();
//步骤一:创建Sql
String sql="select * from news,topic where news.ntid=topic.tid";
//步骤二:执行
ResultSet rs = executeQuery(sql);
//步骤三:装载数据
if(rs!=null) {
while(rs.next()) {
News news=new News();
news.setNid(rs.getInt("nid"));
news.setNtitle(rs.getString("ntitle"));
news.setNtid(rs.getInt("ntid"));
news.setNauthor(rs.getString("nauthor"));
news.setNcontent(rs.getString("ncontent"));
news.setNpicPath(rs.getString("npicpath"));
news.setNcreateDate(rs.getDate("ncreateDate"));
news.setNmodifyDate(rs.getDate("nmodifyDate"));
news.setNsummary(rs.getString("nsummary"));
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
//怎么让当前拿到的News对象和Topic对象关联起来
news.setTopic(topic);
newsList.add(news);
}
}
return newsList;
}
3.创建Service层接口,跟Dao层接口的方法相同
public interface INewsService {
//查询所有新闻的方法
public List<News> getAllNews() throws Exception;
}
4.创建Service层的实现类,实现Service层接口
public class INewsServiceImpl implements INewsService{
//植入Dao层接口对象
private INewsDao newsDao=new INewsDaoImpl();
6.开发Servlet层,创建了一个类,这个类继承了HttpServlet抽象类,重写了doGet()和doPost()方法,在doGet()中调用doPost(),内部实现逻辑如下:
6.1从前台能够接受到用户提交的用户名和密码
6.2调用service层的login方法执行登录操作
6.3接收方法的返回值,判断返回值是否为空,如果为空则代表登录失败,跳转到Login.jsp,如果不为空,将用户信息保存到session对象当中,并且跳转到首页
二.非法路径拦截(没有登录的用户无法进行后台操作)
在需要拦截的页面中加入如下代码(判断session对象当中是否有用户登录的信息,如果没有则跳转到登录页面)
<%
//获取Session的存储的登录信息
User user=(User)session.getAttribute("user");
if(user==null){
response.sendRedirect("page/login/login.jsp");
}
%>
三.退出系统
在Servlet当中加上对应模块的代码,用了一个action地址区分不同的功能
if(action.equals("logOut")) {
//清空Session
req.getSession().removeAttribute("user");
resp.sendRedirect("/NewsManager");
}
<a href="<%=basePath %>IUserInfoServlet?action=logOut" class="signOut"><i class="seraph icon-tuichu"></i><cite>退出</cite></a>
四.新闻列表
1.开发Dao层,创建一个Dao层接口,在接口中添加一个查询所有新闻的方法
public interface INewsDao {
//查询所有新闻的方法
public List<News> getAllNews() throws Exception;
}
2.创建Dao层实现类,创建一个类,实现Dao层接口,然后执行数据库查询操作
@Override
public List<News> getAllNews() throws Exception {
List<News> newsList=new ArrayList<News>();
//步骤一:创建Sql
String sql="select * from news,topic where news.ntid=topic.tid";
//步骤二:执行
ResultSet rs = executeQuery(sql);
//步骤三:装载数据
if(rs!=null) {
while(rs.next()) {
News news=new News();
news.setNid(rs.getInt("nid"));
news.setNtitle(rs.getString("ntitle"));
news.setNtid(rs.getInt("ntid"));
news.setNauthor(rs.getString("nauthor"));
news.setNcontent(rs.getString("ncontent"));
news.setNpicPath(rs.getString("npicpath"));
news.setNcreateDate(rs.getDate("ncreateDate"));
news.setNmodifyDate(rs.getDate("nmodifyDate"));
news.setNsummary(rs.getString("nsummary"));
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
//怎么让当前拿到的News对象和Topic对象关联起来
news.setTopic(topic);
newsList.add(news);
}
}
return newsList;
}
3.创建Service层接口,跟Dao层接口的方法相同
public interface INewsService {
//查询所有新闻的方法
public List<News> getAllNews() throws Exception;
}
4.创建Service层的实现类,实现Service层接口
public class INewsServiceImpl implements INewsService{
//植入Dao层接口对象
private INewsDao newsDao=new INewsDaoImpl();
@Override
public List<News> getAllNews() throws Exception {
return newsDao.getAllNews();
}
public List<News> getAllNews() throws Exception {
return newsDao.getAllNews();
}
}
5.Servlet处理用户请求,调用service层拿到从数据库查询出来的数据,将数据保存到request作用域当中,跳转到新闻列表页面
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action=req.getParameter("action");
if(action.equals("newsList")) {
//执行查询新闻列表操作
try {
List<News> allNews = newService.getAllNews();
for (News news : allNews) {
System.out.println(news.getNid());
}
//把集合数据保存下来
req.setAttribute("newsList", allNews);
//跳转页面
req.getRequestDispatcher("page/news/newsList.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.渲染数据
<table class="layui-table">
<thead>
<tr>
<th>新闻编号</th>
<th>新闻标题</th>
<th>新闻类别</th>
<th>发布者</th>
<th>发布时间</th>
<th>操作</th>
</tr>
<%
List<News> newsList = (List<News>) request.getAttribute("newsList");
for (News news : newsList) {
%>
<tr>
<td><%=news.getNid()%></td>
<td><%=news.getNtitle()%></td>
<td><%=news.getTopic().getTname()%></td>
<td><%=news.getNauthor()%></td>
<td><%=news.getNcreateDate()%></td>
<td><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-primary" lay-event="look">预览</a></td>
</tr>
<%
}
%>
5.Servlet处理用户请求,调用service层拿到从数据库查询出来的数据,将数据保存到request作用域当中,跳转到新闻列表页面
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action=req.getParameter("action");
if(action.equals("newsList")) {
//执行查询新闻列表操作
try {
List<News> allNews = newService.getAllNews();
for (News news : allNews) {
System.out.println(news.getNid());
}
//把集合数据保存下来
req.setAttribute("newsList", allNews);
//跳转页面
req.getRequestDispatcher("page/news/newsList.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.渲染数据
<table class="layui-table">
<thead>
<tr>
<th>新闻编号</th>
<th>新闻标题</th>
<th>新闻类别</th>
<th>发布者</th>
<th>发布时间</th>
<th>操作</th>
</tr>
<%
List<News> newsList = (List<News>) request.getAttribute("newsList");
for (News news : newsList) {
%>
<tr>
<td><%=news.getNid()%></td>
<td><%=news.getNtitle()%></td>
<td><%=news.getTopic().getTname()%></td>
<td><%=news.getNauthor()%></td>
<td><%=news.getNcreateDate()%></td>
<td><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-primary" lay-event="look">预览</a></td>
</tr>
<%
}
%>
</thead>
</table>
新闻删除:
1.在INewsDao接口中创建删除方法
//删除新闻
public int deleteNews(int nid) throws Exception;
2.在INewsDaoImpl中重写该方法,执行数据库操作
@Override
public int deleteNews(int nid) throws Exception {
String sql="delete from news where nid=?";
int count = executeUpdate(sql, nid);
return count;
}
3.在INewsService接口中创建删除方法,供Servlet调用
//删除新闻
public int deleteNews(int nid) throws Exception;
4.在INewsServiceImpl实现类中重写该方法,调用Dao层该方法
@Override
public int deleteNews(int nid) throws Exception {
return newsDao.deleteNews(nid);
}
5.在INewsServlet中通过action控制功能,调用Service层该方法进行删除,删除成功调用新闻列表地址
else if(action.equals("deleteNews")) {
//获取页面上选择的新闻id
String nid=req.getParameter("nid");
try {
//执行删除信息的方法
int count = newService.deleteNews(Integer.parseInt(nid));
if(count>0) {
req.getRequestDispatcher("INewsServlet?action=newsList").forward(req, resp);
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
6.页面中找到删除按钮,添加Servlet地址,进行删除
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del" href="INewsServlet?action=deleteNews&nid=<%=news.getNid() %>">删除</a>
1.在INewsDao接口中创建删除方法
//删除新闻
public int deleteNews(int nid) throws Exception;
2.在INewsDaoImpl中重写该方法,执行数据库操作
@Override
public int deleteNews(int nid) throws Exception {
String sql="delete from news where nid=?";
int count = executeUpdate(sql, nid);
return count;
}
3.在INewsService接口中创建删除方法,供Servlet调用
//删除新闻
public int deleteNews(int nid) throws Exception;
4.在INewsServiceImpl实现类中重写该方法,调用Dao层该方法
@Override
public int deleteNews(int nid) throws Exception {
return newsDao.deleteNews(nid);
}
5.在INewsServlet中通过action控制功能,调用Service层该方法进行删除,删除成功调用新闻列表地址
else if(action.equals("deleteNews")) {
//获取页面上选择的新闻id
String nid=req.getParameter("nid");
try {
//执行删除信息的方法
int count = newService.deleteNews(Integer.parseInt(nid));
if(count>0) {
req.getRequestDispatcher("INewsServlet?action=newsList").forward(req, resp);
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
6.页面中找到删除按钮,添加Servlet地址,进行删除
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del" href="INewsServlet?action=deleteNews&nid=<%=news.getNid() %>">删除</a>
六.新闻添加
步骤:需要将新闻分类的数据绑定到newsAdd.jsp页面中的下拉列表
1.创建Dao层接口:ITopicDao,在里面写了一个方法用于查询所有的新闻分类
//查询新闻分类
public List<Topic> getAllTopic() throws Exception;
2.创建Dao层接口实现类:ITopicDaoImpl,重写Dao层方法,查询数据
@Override
public List<Topic> getAllTopic() throws Exception {
List<Topic> topicList=new ArrayList<>();
//SQL语句
String sql="select * from topic";
ResultSet rs = executeQuery(sql);
if(rs!=null) {
while(rs.next()) {
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
topicList.add(topic);
}
}
closeResource();
return topicList;
}
3.创建Service层接口,跟Dao层接口的方法相同
//查询新闻分类
public List<Topic> getAllTopic() throws Exception;
4.创建Service层的实现类,实现Service层接口
public class ITopicServiceImpl implements ITopicService{
//创建Dao层接口对象
private ITopicDao topicDao=new ITopicDaoImpl();
步骤:需要将新闻分类的数据绑定到newsAdd.jsp页面中的下拉列表
1.创建Dao层接口:ITopicDao,在里面写了一个方法用于查询所有的新闻分类
//查询新闻分类
public List<Topic> getAllTopic() throws Exception;
2.创建Dao层接口实现类:ITopicDaoImpl,重写Dao层方法,查询数据
@Override
public List<Topic> getAllTopic() throws Exception {
List<Topic> topicList=new ArrayList<>();
//SQL语句
String sql="select * from topic";
ResultSet rs = executeQuery(sql);
if(rs!=null) {
while(rs.next()) {
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
topicList.add(topic);
}
}
closeResource();
return topicList;
}
3.创建Service层接口,跟Dao层接口的方法相同
//查询新闻分类
public List<Topic> getAllTopic() throws Exception;
4.创建Service层的实现类,实现Service层接口
public class ITopicServiceImpl implements ITopicService{
//创建Dao层接口对象
private ITopicDao topicDao=new ITopicDaoImpl();
@Override
public List<Topic> getAllTopic() throws Exception {
return topicDao.getAllTopic();
}
}
5.创建Servlet实现用户访问
String action=request.getParameter("action");
if(action.equals("topicList")) {
//查询所有新闻分类的操作
try {
List<Topic> allTopic = topicService.getAllTopic();
request.setAttribute("topicList", allTopic);
request.getRequestDispatcher("page/news/newsAdd.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
6.在newsList.jsp页面中,找到添加文章按钮,将href属性值改为访问Servlet的地址
<a class="layui-btn layui-btn-normal" href="<%=basePath %>ITopicServlet?action=topicList">添加文章</a>
7.newsAdd.jsp页面的数据渲染
<select name="topic" lay-verify="required">
<%
List<Topic> allTopic=(List<Topic>)request.getAttribute("topicList");
for(Topic topic:allTopic){
%>
<option value="<%=topic.getTid()%>"><%=topic.getTname()%></option>
<%
}
%>
</select>
5.创建Servlet实现用户访问
String action=request.getParameter("action");
if(action.equals("topicList")) {
//查询所有新闻分类的操作
try {
List<Topic> allTopic = topicService.getAllTopic();
request.setAttribute("topicList", allTopic);
request.getRequestDispatcher("page/news/newsAdd.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
6.在newsList.jsp页面中,找到添加文章按钮,将href属性值改为访问Servlet的地址
<a class="layui-btn layui-btn-normal" href="<%=basePath %>ITopicServlet?action=topicList">添加文章</a>
7.newsAdd.jsp页面的数据渲染
<select name="topic" lay-verify="required">
<%
List<Topic> allTopic=(List<Topic>)request.getAttribute("topicList");
for(Topic topic:allTopic){
%>
<option value="<%=topic.getTid()%>"><%=topic.getTname()%></option>
<%
}
%>
</select>