今天主要是三层架构的一个进阶,我们要把三层构架运用到我们原先的新闻系统中去,所以今天主要是代码, 大家看下在新闻系统中是如何运用三层构架。
目录
1.文件放置位置
2.三层构造创建
3.接口的作用
4.实操代码
【命名规则】
com.biz -> Biz接口
com.biz.impl ->Biz的接口实现类
com.dao -> Dao接口
com.dao.impl -> Dao接口的实现类
在JavaWeb 11中我们在运用三层构造时,是先写biz接口和biz的实现类(业务逻辑层),但是在我们正常运用三层构造时,应该先把dao接口&dao接口的实现类(数据访问层)先写好,把在要用的方法,都在接口中先写好,列如:增,删,改,查.......,然后在数据访问层有的方法,在业务逻辑层都要实现。
【调用顺序】
表示层->业务逻辑层->数据库访问层----- |
|
表示层<-业务逻辑层<-数据库访问层------|
表示层:在JavaWeb中表示层为JSP文件,就像登录界面,新闻首页
业务逻辑层: biz接口和biz实现类
数据库访问层 :dao接口和dao的实现类
在我们运用三层构造时,业务逻辑层和数据访问层都有接口,实现类会实现我们的接口,而当实现类实现了该接口,那么接口中有的方法你也要具备,因为实现类实现了该接口,如果不写接口中的方法,那么无法运行,起到约束的一个作用。
1.dao接口&dao的实现类(数据访问层)
dao接口代码如下:
package com.yjx.dao;
import java.util.List;
import com.yjx.pojo.News;
import com.yjx.pojo.User;
/**
* 数据访问层接口
* @author zjjt
*
*/
public interface IDao {
//页数的方法
List selectLsit(String name,int page);
//根据用户名和密码查询数据
User select(User u);
//删除新闻
int del(int id);
//有几页
int select(String name);
}
dao实现类代码如下:
package com.yjx.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.yjx.dao.IDao;
import com.yjx.pojo.News;
import com.yjx.pojo.User;
import ulit.DBHeper;
/**
* 存放数据访问层的实体类
* @author zjjt
*
*/
public class DaoImpl implements IDao{
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
/**
*
* @param name 标题名字
* @param page 页数
* @return
*/
public List selectLsit(String name,int page){
List list=new ArrayList();
int row=5;//条数,因为每一页五条数据
//初始
int begin=1+(page-1)*5;
//末尾
int last=page*row;
try {
con=DBHeper.getCon();
ps=con.prepareStatement("select * from(select a.*,rownum myr from jw05_news a where news_title like ?)b where myr between ? and ?");
ps.setString(1,"%"+name+"%");
ps.setInt(2, begin);
ps.setInt(3, last);
rs=ps.executeQuery();
while(rs.next()) {
News news=new News();
news.setNews_id(rs.getInt(1));
news.setNews_title(rs.getString(2));
news.setNews_topic(rs.getInt(3));
news.setNews_author(rs.getString(4));
news.setNews_publisher(rs.getString(5));
news.setNews_contet(rs.getString(6));
news.setNews_cover(rs.getString(7));
news.setNews_count(rs.getInt(8));
list.add(news);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHeper.getColse(con, ps, rs);
}
return list;
}
/**
* 查找用户
*/
public User select(User u) {
try {
con=DBHeper.getCon();
ps=con.prepareStatement("select * from jw05_user where uname=? and upwd=?");
ps.setString(1,u.getUsername());
ps.setString(2,u.getUserpwd());
rs=ps.executeQuery();
while(rs.next()) {
User user=new User();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setUserpwd(rs.getString(3));
return user;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHeper.getColse(con, ps, rs);
}
return null;
}
/**
* 删除新闻
*/
public int del(int id) {
try {
con=DBHeper.getCon();
ps=con.prepareStatement("delete from jw05_news where news_id=?");
ps.setInt(1, id);
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHeper.getColse(con, ps, rs);
}
return 0;
}
/**
* 算出页数
*/
public int select(String name) {
//页数=总的新闻条数/条数
int row=5;//条数
int count=0;//总的条数
try {
con=DBHeper.getCon();
ps=con.prepareStatement("select count(1) from jw05_news where news_title like ?");
ps.setString(1,"%"+name+"%");
rs=ps.executeQuery();
if(rs.next()) {
count=rs.getInt(1);//第一列是新闻的总数
}
//求出页数,Math.ceil向上取整
return new Double(Math.ceil(count*1.0/row)).intValue();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHeper.getColse(con, ps, rs);
}
return 0;
}
}
2.biz接口&biz实现类(业务逻辑层)
biz接口代码如下:
package com.yjx.biz;
import java.util.List;
import com.yjx.pojo.News;
import com.yjx.pojo.User;
public interface IUserBiz {
//页数的方法
List selectLsit(String name,int page);
//根据用户名和密码查询数据
User select(User u);
//删除新闻
int del(int id);
//有几页
int select(String name);
}
biz实现类接口代码如下:
package com.yjx.biz.impl;
import java.util.List;
import javax.websocket.Session;
import com.yjx.biz.IUserBiz;
import com.yjx.dao.IDao;
import com.yjx.dao.impl.DaoImpl;
import com.yjx.pojo.News;
import com.yjx.pojo.User;
public class UserBizImpl implements IUserBiz{
IDao dao=new DaoImpl();
/**
* 让每一页显示5条数据
*/
@Override
public List selectLsit(String name, int page) {
List list=dao.selectLsit(name, page);
return list;
}
/**
*根据用户名和密码查询数据
*/
@Override
public User select(User u) {
User user=dao.select(u);
return user;
}
/**
* 总条数/每页条数=页数
* 算出页数
*/
@Override
public int select(String name) {
int i=dao.select(name);
return i;
}
/**
* 删除新闻
*/
@Override
public int del(int id) {
int i=dao.del(id);
return i;
}
}
3.新闻系统中运用(表示层)
do.login界面代码如下:
运用根据用户名和密码查询数据
<%@page import="com.yjx.biz.impl.UserBizImpl"%>
<%@page import="com.yjx.biz.IUserBiz"%>
<%@page import="com.yjx.pojo.User"%>
<%@page import="com.yjx.dao.impl.DaoImpl"%>
<%@page import="ulit.DBHeper"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="oracle.jdbc.driver.OracleDriver"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//拿到数据
String name=request.getParameter("username");
String pwd=request.getParameter("userpwd");
User user=new User(0,name,pwd);
//业务逻辑层
IUserBiz userbiz=new UserBizImpl();
User u=userbiz.select(user);
if(u!=null){
//将用户名存入到服务器的session中(存在后台)
//setAttribute("属性名",属性值)
session.setAttribute("username",name);
Object obj= application.getAttribute("count");
if(obj==null){
obj=0;
}
//将obj转成int
Integer count=(Integer)obj;
count++;
application.setAttribute("count", count);
//cookie的值每次发送请求时会被自动带上
//cookie是默认在你当前浏览器打开的过程中生效
//将用户名和用户的密码存在前台
Cookie cookie01=new Cookie("username",name);
Cookie cookie02=new Cookie("userpwd",pwd);
//设置存活时间
//-1你当前浏览器打开的过程中生效
cookie01.setMaxAge(60*60*24*7);
cookie02.setMaxAge(60*60*24*7);
//response 响应
response.addCookie(cookie01);
response.addCookie(cookie02);
//存在的话跳转到新闻首页
//重定向
response.sendRedirect("news/index.jsp");
}else{
//用户不存在数据库中,返回登录界面
//重定向
response.sendRedirect("login.jsp");
}
%>
新闻首页代码如下:
运用了 页数的方法&让每一页显示5条数据
<%@page import="com.yjx.biz.impl.UserBizImpl"%>
<%@page import="com.yjx.biz.IUserBiz"%>
<%@page import="com.yjx.pojo.News"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@page import="com.yjx.dao.impl.DaoImpl"%>
<%@page import="ulit.DBHeper"%>
<%@page import="java.nio.charset.StandardCharsets"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String newsName=request.getParameter("newsName");
//判断newsName
//如果为null值,设置为空字符串
if(newsName==null){
newsName="";
}
%>
bootstrap
<%
//当用户为空,返回登录界面
Object name=session.getAttribute("username");
if(name==null){
response.sendRedirect("web07/login.jsp");
}
%>
<%
//拿到页数
String pag=request.getParameter("page");
//当我们进入新闻首页的时候,还没有点击下方那个,所以pag为空
int index=1;
//我们做判断,当pag不为空时
if(pag!=null){
index=Integer.parseInt(pag);
}
//业务逻辑层
IUserBiz userbiz=new UserBizImpl();
List news=userbiz.selectLsit(newsName,index);
//获得一共几页
int pages=userbiz.select(newsName);
for(News n:news){
%>
<%=n.getNews_title()%>
<%=n.getNews_author()%>
<%=n.getNews_count()%>
1000
<%=n.getNews_publisher()%>
<%
}
%>
阅读界面代码如下:
删除新闻数据方法
<%@page import="java.net.URLEncoder"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.Date"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.Connection" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
bootstrap
<%
//去session中拿历史列表
Object obj=session.getAttribute("history");
List history=new ArrayList<>();
if(obj!=null){//历列表存在
history=(List)obj;
}
//拿到传过来的id
String newId=request.getParameter("newId");
//用cookie来写
//拿到cookie
String s="";
for(Cookie cokie:request.getCookies()){
if(cokie.getName().equals("history")){
s=cokie.getValue();
}
}
//1.获取驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.定义连接字符
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//3.获得连接
Connection con=DriverManager.getConnection(url,"scott","zking123");
//4.获得执行对象
PreparedStatement ps=con.prepareStatement("select *from jw05_news where news_id=? ");
ps.setInt(1,Integer.parseInt(newId));
ResultSet rs=ps.executeQuery();
//定义需要的值
String title="";
int topic=0;
String author="";
String publisher="";
String content="";
int count=0;
if(rs.next()){
title=rs.getString(2);
topic=rs.getInt(3);
author=rs.getString(4);
publisher=rs.getString(5);
content=rs.getString(6);
//阅读量
count=rs.getInt(8)+1;
}
//将阅读信息存在集合中
history.add(title+"@"+count);
//将历史记录存进session中
session.setAttribute("history", history);
s+=title+""+count;
response.addCookie(new Cookie("history", URLEncoder.encode(s, "utf-8")));
//根据id修改
ps=con.prepareStatement("update jw05_news set news_count=news_count+1 where news_id=? ");
ps.setInt(1, Integer.parseInt(newId));
int i=ps.executeUpdate();
%>
<%
ps=con.prepareStatement("select * from jw05_comment where c_from=?");
ps.setInt(1, Integer.parseInt(newId));
rs=ps.executeQuery();
while(rs.next()){
%>
<%=rs.getString(4)%>
<%=rs.getString(5)%>
<%=rs.getString(3) %>
<%
}
%>
今天的学习到此结束啦,大家把我们学习的三层构架,运用到原先我们在写的新闻系统中噢,大家跟着代码敲噢。