三层架构

Model1

在Model1模型中,是以JSP为中心,这种模型中JSP既要做页面显示,又要结合业务逻辑处理服务端过程,简单说就是Model1开发没有Servlet,JSP中既有HTML代码又有逻辑代码。JSP页面的交互通过页面的链接完成。

Model1的结构图

Model2

因为Model1的缺点太过明显,在Model1的基础上,Model2对JSP的任务进行分离,将获取参数,调用逻辑这些

和页面显示无关的转到Servlet处理,JSP只做显示即可。

Model2表示的是基于MVC模式的框架

MVC "Model"代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),"view"是应用的表示面(由JSP页面产生),“Controller”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用,从而弥补了Model1的不足。

Model2其实是在Model1基础上又抽了一层控制层。

 

 三层架构图

Model2巧妙的将JSP中的业务逻辑部分分给了Servlet,使得页面控制与逻辑处理彻底分离,达到了部分解耦的目的。但我们现实项目开发中,往往在Model2的基础上又进行了分层。将业务逻辑细分为业务逻辑和持久化逻辑两种。

表示层,JSP/Servlet

业务逻辑层:业务规则(service)

持久化层:主要包装持久化的逻辑

分层主要目的是为了好管理,能更好的适用需求的变换,能够更好的进行人员分工。

具体项目

留言板项目

*先创建一个modle(封装属性包或Javebean)包和util包 (工具包)

modle包下的user类

package com.zhiyou.modle;

public class User {
	private int id;
	private String name;
	private String password;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	
	

}

util包下的DButil类

package com.zhiyou.util;


//连接数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;



public class DButil {
	
	public static final String  DRIVER = "com.mysql.jdbc.Driver";
	public static final String URL="jdbc:mysql://localhost:3306/db_message";
	public static final String NAME="root";
	public static final String PASSWORD="6018";
	/**
	 * 获取连接对象
	 * @return
	 */
	static{
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public static Connection  getConnection(){
		Connection connection =null;
		
		try {
			 connection = DriverManager.getConnection(URL,NAME,PASSWORD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return connection;
		
	}
	public static void close(Connection connection, Statement statement,ResultSet set){
		if(connection !=null){
			
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(statement !=null){
			try {
				statement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(set !=null){
			try {
				set.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
 
}

 

1.将mysql与java连接的架包放在WEB-INF/lib文件夹下

在src文件夹下创建一个数据库文件夹

在WebContent文件夹下创建index.jsp文件作为跳转界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%--
    此处用请求转发动态标签跳转,因为跳转到login.jsp的页面在WEB-INF属于服务器页面,加密程度较高,只能用请求转发标签跳转,重定向的标签和servlet页面无法跳转。为了防止页面跳转路径错误,尽量使用绝对路径。

--%>
	<jsp:forword page="/WEB-INF/user/login.jsp"></jsp:forword>
</body>
</html>

创建登录界面和注册界面,将登录界面和注册界面(jsp文件)创建在WEB-INF文件夹下,并创建一个user文件夹。将登录界面和注册界面放在user文件夹下

//简单的登录界面

	<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    <% 
    String path =request.getContextPath()+"/";
    /* 绝对路径 */
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
   /*  out.println(basePath); */
    %>
<!DOCTYPE html>
<html>
<!--base:当前页面的基准路径  -->
<head>
<base href="<%=path%>"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>登录界面</h1>
	<form action="login">
	<input name= "username" value="${param.username}"/>
	<br/>
	<input name="password"/>
	<br/>
	<input type="submit"  value="登录">
	</form>
	${msg}
    
   /*-跳转到注册界面,因为注册界面在WEB-INF文件下无法使用a标签直接跳转
到注册界面。所以先跳转到一个Servlet界面中,在从Servlet中利用请求转发跳转到
注册界面。
*/
	<p>
	 还没有注册用户,请<a href="user/toRegister">注册</a>
	</p>
</body>
</html>
//简单的注册界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    String path =request.getContextPath()+"/";
    
    
    %>
    
<!DOCTYPE html>
<html>
<head>
<base href="<%=path%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   
	<h1>注册界面</h1>
	<form action="register">/* 跳转到RegisterServlet里 */
	<input name= "username"/>
	<br/>
	<input name="password"/>
	<br/>
	<input type="submit"  value="注册">
	</form>
	${msg}
</body>
</html>

在src文件夹下创建一个servlet包,在servlet包下创建一个ForwardRegisterServlet类,该类实现登录界面向注册界面跳转的桥梁。

package com.zhiyou.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ForwordRegisterServlet
 */
@WebServlet("/user/toRegister")
public class ForwardRegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ForwardRegisterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//response.getWriter().append("Served at: ").append(request.getContextPath());
        

  //此处使用请求转发跳转,所写的路劲为绝对路径




		request.getRequestDispatcher("/WEB-INF/user/register.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在servlet包下创建RegisterServlet处理页面注册,在处理页面注册时,需要建立一个dao包,(利用dao包对数据的数据进行查询和录入)在dao包下建立一个。

UserDao接口(实现面向对象),然后在从道包下建立一个imple包,在该包下实现UserDao接口。在UserDao接口写两个抽象方法(根据名字查询信息的抽象方法,在进行实例化,录入姓名和密码信息的抽象方法,在进行实例化);

dao包接口UserDao

package com.zhiyou.dao;

/**
     dao包接口
*/


import com.zhiyou.modle.User;

public interface UserDao {
	/**
	 * 添加一条用户记录
	 * @param name
	 * @param password
	 */
	 void addUser(String name ,String password);
	 
	 /**
	  * 根据用户名查询用户信息
	  */
	 User getUserByName(String name);
	 
	 
}

实现道包接口UserDaoImpl类(普通类,实例化)

package com.zhiyou.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.zhiyou.dao.UserDao;
import com.zhiyou.modle.User;
import com.zhiyou.util.DButil;

public class UserDaoimpl implements UserDao {

	
	//录入名字和信息
	@Override
	public void addUser(String name, String password) {
		// TODO Auto-generated method stub
		Connection connection = DButil.getConnection();
		String  sql="insert into user(name,password) values(?,?)";
		try {
			PreparedStatement pStatement = connection.prepareStatement(sql);
			pStatement.setString(1, name);
			pStatement.setString(2, password);
			pStatement.execute();
			DButil.close(connection, pStatement, null);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	
	//根据姓名查询信息
	@Override
	public User getUserByName(String name) {
		// TODO Auto-generated method stub
		User user =null;
		Connection connection = DButil.getConnection();
		String sql="select*from user where name=?";
		try {
			PreparedStatement pStatement = connection.prepareStatement(sql);
			pStatement.setString(1,name);
			ResultSet set = pStatement.executeQuery();
			while(set.next()){
				user = new User();
				user.setId(set.getInt("id"));
				user.setName(name);
				user.setPassword(set.getString("password"));
				
			}
			DButil.close(connection, pStatement, set);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return user ;
	}

}

在创建一个service包,此包主要作用是处理逻辑包(持久逻辑包)在该包下先创建一个UserService接口(面向对象编程)在创建一个imple包在创建UserServiceImple类实现该接口。在创建一个异常包<UserException类>用于处理登录

UserService接口

package com.zhiyou.service;

import com.zhiyou.modle.User;
import com.zhiyou.service.exception.UserException;

/**
 * 专门处理和用户相关的业务逻辑
 * @author Administrator
 *
 */

public interface UserService {
	
	/**
	 * 注册逻辑 
	 * @param name
	 * @param password
	 * @return 是否注册成功
	 *
	 */
	
	boolean register(String name ,String password);
	/**
	 * 登录逻辑
	 * @param name
	 * @param password
	 * @return
	 */
	
	boolean login(String name,String password);
	/**
	 * 登录
	 * @param name
	 * @param password
	 * @return 用户参数
	 * @throws UserException 
	 */
	User  login2(String name ,String password) throws UserException;
	
	
}

用于处理UserException类

package com.zhiyou.service.exception;

public class UserException extends Exception {

	public UserException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}
	

}

UserServiceImple类

package com.zhiyou.service.impl;

import com.zhiyou.dao.UserDao;
import com.zhiyou.dao.impl.UserDaoimpl;
import com.zhiyou.modle.User;
import com.zhiyou.service.UserService;
import com.zhiyou.service.exception.UserException;

public class UserServiceImpl implements UserService {
	
		UserDao userDao =new  UserDaoimpl();
		
	@Override
	public boolean register(String name, String password) {
		// TODO Auto-generated method stub
		
		User user = userDao.getUserByName(name);
		if(user==null){
			
			userDao.addUser(name, password);
			return true;
			
		}
		
		return false;
	}


-------------------------------------------------------------------

	@Override
	public boolean login(String name, String password) {
		// TODO Auto-generated method stub
		User user = userDao.getUserByName(name);
		if(user!=null){
			//已经注册过
			if(password.equals(user.getPassword())){
				
				return true;
			}
			
		}
		return false;
	}

------------------------------------------------------------------	
	
	
	@Override
	public User login2(String name, String password) throws UserException {
		// TODO Auto-generated method stub
		User user = userDao.getUserByName(name);
		if(user==null){
			//用户没有注册
			throw new UserException("用户名错误");  
			
		}else {
			//用户注册过
			if(password.equals(user.getPassword())){
				
				//密码正确
			}else{
				
				throw new UserException("密码错误");
			}
		}
		
		return user;
	}
	

}

在servlet创建RegisterServlet类,用于处理注册以及注册跳转

package com.zhiyou.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zhiyou.service.UserService;
import com.zhiyou.service.impl.UserServiceImpl;

/**
 * Servlet implementation class RegisterServlet
 */
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RegisterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//接受请求参数
		String name = request.getParameter("username");
		String password = request.getParameter("password");
		//逻辑处理
		UserService userService = new UserServiceImpl();
		boolean isSus = userService.register(name, password);
		if(isSus==true){
			//成功
			request.getRequestDispatcher("/WEB-INF/user/login.jsp").forward(request, response);
			
		}else {
			request.setAttribute("msg", "该用户名已存在");
			request.getRequestDispatcher("/WEB-INF/user/register.jsp").forward(request, response);
		}
		
		
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在servlet里创建一个LoginServlet类用于登录的跳转

package com.zhiyou.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zhiyou.modle.User;
import com.zhiyou.service.UserService;
import com.zhiyou.service.exception.UserException;
import com.zhiyou.service.impl.UserServiceImpl;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//获取参数
		String name = request.getParameter("username");
		String password = request.getParameter("password");
		//逻辑处理
		UserService userService = new UserServiceImpl();
		/*if(userService.login(name, password)){
			//登录成功
			request.getRequestDispatcher("/WEB-INF/msg/list.jsp").forward(request, response);
			
		}else {
			
			request.getRequestDispatcher("/WEB-INF/user/login.jsp").forward(request, response);
		}*/
		try {
			User user = userService.login2(name, password);
			//登录成功
			//保存用户数据
			HttpSession session = request.getSession();
			session.setAttribute("user", user);
			//界面跳转
			request.getRequestDispatcher("/WEB-INF/msg/list.jsp").forward(request, response);
		} catch (UserException e) {
			// TODO Auto-generated catch block
			//登录失败
			request.setAttribute("msg", e.getMessage());
			request.getRequestDispatcher("/WEB-INF/user/login.jsp").forward(request, response);
		}
		
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值