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);
}
}