JavaWeb 三层架构项目集成

   今天主要是三层架构的一个进阶,我们要把三层构架运用到我们原先的新闻系统中去,所以今天主要是代码, 大家看下在新闻系统中是如何运用三层构架。

目录

1.文件放置位置

 2.三层构造创建

3.接口的作用

4.实操代码


1.文件放置位置

  【命名规则】   

      com.biz -> Biz接口
      com.biz.impl ->Biz的接口实现类
      com.dao -> Dao接口
      com.dao.impl -> Dao接口的实现类

JavaWeb 三层架构项目集成_第1张图片

 2.三层构造创建

在JavaWeb 11中我们在运用三层构造时,是先写biz接口和biz的实现类(业务逻辑层),但是在我们正常运用三层构造时,应该先把dao接口&dao接口的实现类(数据访问层)先写好,把在要用的方法,都在接口中先写好,列如:增,删,改,查.......,然后在数据访问层有的方法,在业务逻辑层都要实现。

 
 【调用顺序】
  表示层->业务逻辑层->数据库访问层----- |
                                                                  |
  表示层<-业务逻辑层<-数据库访问层------|

 

   表示层:在JavaWeb中表示层为JSP文件,就像登录界面,新闻首页

   业务逻辑层: biz接口和biz实现类

   数据库访问层 :dao接口和dao的实现类

3.接口的作用

在我们运用三层构造时,业务逻辑层和数据访问层都有接口,实现类会实现我们的接口,而当实现类实现了该接口,那么接口中有的方法你也要具备,因为实现类实现了该接口,如果不写接口中的方法,那么无法运行,起到约束的一个作用。

4.实操代码

   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()%>

  • <% } %>
    • «
    • <% //for循环遍历,得到有几页我们就遍历几个 for(int i=1;i<=pages;i++){ %>
    • "><%=i%>
    • <% } %>
    • »

     阅读界面代码如下:

       删除新闻数据方法

    <%@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();
    %>
    

    <%=title%>

    <%=author%> <%=count%> 1000

    <%=content%>
    <% 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) %>

    <% } %>

    今天的学习到此结束啦,大家把我们学习的三层构架,运用到原先我们在写的新闻系统中噢,大家跟着代码敲噢。

    你可能感兴趣的:(web,html,java)