目录
JSP概述
概念
- JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为
xxx.jsp。 - 与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容
- 弥补servlet不便于发送大量数据的不足
JSP的示例
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Time</title>
</head>
<body>
现在的时间是:<%= new Date()%>
</body>
</html>
JSP与Servlet的关系
JSP的语法结构
- 声明区
- 程序代码区
- 表达式
- 注释
- 指令和动作
- 内置对象
声明区
- 基本语法:
<%! %> - 说明:可以定义全局变量、方法、类。
<%! int i; public void setName(){… …} %>
程序代码区
- 基本语法:
<%程序代码区%> - 说明:可以定义局部变量以及放入任何的Java程序代码。
<% int j; for (int k=0; k<10; k++) { … … } %>
表达式
- 基本语法:
<%=… …%> - 说明:可以在浏览器输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的表达式。
- 注意:不需要以 ; 结束,只有一行
<%=“hello world”%> <%=i+1%>
注释
格式:
<!--… …--> HTML文件的注释,浏览器可以查看到
<%--… …--%> JSP文件的注释,浏览器看不到
<%//… …%> Java语言中的单行注释,浏览器看不到
<%/*… …*/%> Java语言中的多行注释,浏览器看不到
注释的内容不会被执行
示例一
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试变量的声明和打印</title>
<%!
int ia; // 这是一个全局变量
public void show() {
System.out.println("这是全局方法!");
}
public class MyClass {
{
System.out.println("这是一个全局类!");
}
}
%>
<%
int ib = 20; // 这是一个局部变量
for (int i = 0; i < 3; i++) {
System.out.println("Java程序代码!");
}
%>
</head>
<body>
<%= ia+1 %> <%-- 1 --%>
<%= ib %> <%-- 20 --%>
<%= "我就暂时写到这里吧!"%> <%-- 我就暂时写到这里吧! --%>
</body>
</html>
示例二
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<%--
使用for循环输出一个html语言的表格,具体表头如下:
id name age salary
1 1 1 1
2 2 2 2
...
5 5 5 5
--%>
<html>
<head>
<title>实现表格的绘制</title>
</head>
<body>
<table>
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>salary</td>
</tr>
<%
for (int i = 1; i < 6; i++) {
%>
<tr>
<td> <%= i %> </td>
<td> <%= i %> </td>
<td> <%= i %> </td>
<td> <%= i %> </td>
</tr>
<%
}
%>
</table>
</body>
</html>
指令和动作
- 指令格式:
<%@指令 属性=“属性值”%> - 指令的属性可以设定多个。
- JSP常用指令有:page(页面)、taglib(标签库)、include(包括)。
page指令
- page指令用于导包和设置一些页面属性,常用属性如下:
- import 导入相应的包,惟一允许在同一文档中多次出现的属性
- contentType 设置Content-Type响应报头,标明即将发送到浏览器的文档类型
- pageEncoding 设置页面的编码
- language 指定页面使用的语言
- session 控制页面是否参与HTTP会话
- errorPage 处理当前页面中抛出但未被捕获的任何异常
- isErrorPage 当前页是否可以作为其他页面的错误处理页面
<%@ page import="java.util.List" %> <%@ page import="java.util.LinkedList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %> <html> <head> <title>page指令的使用</title> </head> <body> <% List<String> list = new LinkedList<String>(); %> </body> </html>
taglib指令
- taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
<!-- prefix属性用于指定库前缀 --> <!-- uri属性用于指定库的标识 --> <%@taglib uri=“tagLibary” prefix=“prefix”%>
include指令
- include指令用于引入另一个JSP程序或HTML文件等,格式如下:
<%@include file=“被包含的文件地址%>
- JSP引擎会在JSP文件的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%-- 表示包含或引入head.jsp文件 include指令的方式 静态包含--%> <%--<%@ include file="head.jsp"%>--%> <%-- include动作的方式 动态包含 推荐 --%> <jsp:include page="head.jsp"></jsp:include> <html> <head> <title>文件引入的使用</title> </head> <body> </body> </html>
jsp:include/jsp:param
- jsp:include动作用于引入另一个JSP程序或HTML文件等。
- 执行到include时,被include的文件才会被编译。
如果include的是jsp文件,那它不会被转换成Servlet文件。<jsp:include page=“URLSpec” flush=“true”/> <jsp:include page=“URLSpec” flush=“true”> <jsp:param name=“key” value=“value”/> </jsp:include>
include指令和include动作的区别
- include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入再编译执行(静态包含)。
- include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)。
jsp:forward/jsp:param
- forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理。
<jsp:forward page=“urlSpec” flush=“true”/> <jsp:forward page=“urlSpec”> <!-- 用于指定参数和其对应的值 --> <jsp:param name=“key” value=“value”/> </jsp:forward>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>JSP页面的转发实现</title> </head> <body> <jsp:forward page="target.jsp"> <jsp:param name="name" value="zhangfei"/> </jsp:forward> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>转发的目标文件</title> </head> <body> <h1>服务器转发后执行这里的代码哦!</h1> <%= "获取到的数值为:" + request.getParameter("name")%><br/> </body> </html>
JSP内置对象
- 基本概念
- 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
- 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。
对象名称
对象变量 | 对象类型 | 作用 |
---|---|---|
out | JSPWriter | 输出流 |
request | HttpServletRequest | 请求信息 |
response | HttpServletResponse | 响应信息 |
session | HttpSession | 会话 |
application | ServletContext | 全局的上下文对象 |
pageContext | PageContext | JSP页面上下文 |
page | Object | JSP页面本身 |
config | ServletConfig | Servlet配置对象 |
exception | Throwable | 捕获网页异常 |
out内置对象
- out内置对象是一个缓冲的输出流,用来给客户端输出信息。
- 常用方法
方法声明 | 方法介绍 |
---|---|
void println(String x) | 向客户端输出各种类型数据 |
void newLine() | 输出一个换行符 |
void close() | 关闭输出流 |
int getBufferSize() | 返回缓冲区的大小 |
int getRemaining() | 返回缓冲区中未使用的字节数 |
void flush() | 输出缓冲区里的数据 |
void clearBuffer() | 清除缓冲区里的数据,同时把数据输出到客户端 |
void clear() | 清除缓冲区里的数据,但不把数据输出到客户端 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>out内置对象的使用</title>
</head>
<body>
<%
out.println("<h1>");
out.println("Hello World!");
out.println("</h1>");
//out.close();
int bufferSize = out.getBufferSize();
System.out.println("缓冲区的总大小是:" + bufferSize);
int remaining = out.getRemaining();
System.out.println("缓冲区的剩余字节数为:" + remaining);
System.out.println("已经使用的字节数为:" + (bufferSize - remaining));
out.clear(); // 清除缓冲区 数据不会输出
remaining = out.getRemaining();
System.out.println("缓冲区的剩余字节数为:" + remaining);
%>
</body>
</html>
request内置对象
- request对象封装的是调用JSP页面的请求信息,它是HttpServletRequest接口的一个实例。
- 该对象的属性值只在一个请求中保存。
- 常用方法如下:
常用方法 | 方法介绍 |
---|---|
String getMethod() | 返回客户端向服务器端传送数据的方式 |
String getParameter(String name) | 返回客户端向服务器端传送的参数值 |
String[] getParameterValues( String name) | 获得指定参数的所有值 |
String getRequestURI() | 获得请求地址 |
String getRemoteAddr() | 返回发送请求的客户端或最后一个代理的IP地址 |
int getRemotePort() | 返回发送请求的客户端或最后一个代理的端口号 |
String getServerName() | 获取服务器的名字 |
int getServerPort() | 获取服务器端的端口 |
void setAttribute(String name,Object o) | 在此请求中存储属性。属性在请求之间重置 |
Object getAttribute(String name) | 将指定属性的值作为对象返回,若不存在则返回空值 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>request内置对象的使用</title>
</head>
<body>
<%
String serverName = request.getServerName();
System.out.println("获取到的服务器名称为:" + serverName);
int serverPort = request.getServerPort();
System.out.println("获取到的服务器端口号为:" + serverPort);
// 通过内置对象设置属性信息,也就是存储数据
request.setAttribute("name", "guanyu");
%>
<%-- 实现转发效果,也就是服务器跳转 --%>
<jsp:forward page="requestTarget.jsp"></jsp:forward>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取request对象中的属性值</title>
</head>
<body>
<%= "获取到的属性值为:" + request.getAttribute("name")%> <%-- guanyu --%>
</body>
</html>
response 内置对象
-
response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
-
经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。
-
常用方法如下:
方法声明 方法介绍 void addCookie(Cookie cookie) 添加一个Cookie对象,用于在客户端保存特定的信息 void addHeader(String name, String value) 添加HTTP头信息,该Header信息将发送到客户端 boolean containsHeader(String name) 判断指定名字的HTTP文件头是否存在 void sendRedirect(String location) 重定向JSP文件 void setContentType(String type) 设置类型与编码方式 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>reponse内置对象的使用</title> </head> <body> <% // 表示每隔1秒刷新一次 response.addHeader("refresh", "1"); // 获取当前系统时间 Date d1 = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(d1); %> <%= "当前时间为:" + format %> </body> </html>
session内置对象
-
session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
-
该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。
-
常用方法如下
常用方法 方法介绍 void setAttribute(String name,Object value) 使用指定的名称将对象绑定到此会话 Object getAttribute(String name) 返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定则返回空值 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>session内置对象的使用</title> </head> <body> <% session.setAttribute("name", "liubei"); System.out.println("session内置对象中的数据设置成功!"); %> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>获取session内置对象中的数据</title> </head> <body> <%= "获取到的属性值为:" + session.getAttribute("name")%> </body> </html>
application内置对象
-
application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
-
在整个服务器上保存数据,所有用户共享,多个浏览器都可以共享。
-
常用方法如下:
方法声明 方法介绍 void setAttribute(String name, Object object) 将对象绑定到此servlet上下文中的给定属性名 Object getAttribute(String name) 返回给定名称的servlet容器属性,若没有该名称的属性返回null <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>application内置对象的使用</title> </head> <body> <% application.setAttribute("name", "zhaoyun"); System.out.println("application内置对象中的数据设置成功!"); %> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>application内置对象的获取</title> </head> <body> <%= "获取到的application内置对象的属性为:" + application.getAttribute("name")%> <%-- zhaoyun --%> </body> </html>
pageContext内置对象
-
pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
-
只在一个页面中保存数据。
方法声明 方法介绍 void setAttribute(String name, Object value,int scope) 使用适当的作用域设置指定的名称和值 Object getAttribute(String name, int scope) 返回指定作用域中名称关联的对象,若找不到则返回null ServletRequest getRequest() 获取请求对象 ServletResponse getResponse() 获取响应对象 HttpSession getSession() 获取会话对象 ServletConfig getServletConfig() 获取配置对象 JspWriter getOut() 获取输出对象 Object getPage() 获取页面对象 Exception getException() 获取异常对象 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>pageContext内置对象的使用</title> </head> <body> <% pageContext.setAttribute("name", "huangzhong"); System.out.println("pageContext内置对象中的数据设置成功!"); %> <%= "获取到的pageContext内置对象中的属性值为:" + pageContext.getAttribute("name")%> </body> </html>
exception内置对象
- exception 对象是Throwable的实例,表示的是JSP的异常信息。
- 如果要使用它,必须将对应页面page指令的isErrorPage属性设置成true。
- 单个页面的处理方式.
<%@page errorPage="error.jsp" %>
- 在web.xml中配置统一的异常处理页面。
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error.jsp</location> </error-page>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isErrorPage="true" %> <html> <head> <title>异常处理的页面</title> </head> <body> <% if (exception != null) { out.println("异常的错误信息为:" + exception.getMessage()); } %> </body> </html>
JavaBean组件
概念
- JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复
代码,使整个 JSP 代码的开发更加简洁。 - JavaBean本质上就是Java类,通常要求如下:
- 属性:全部私有化,通过get和set方法进行访问。
- 方法:必须是public关键字修饰。
- 构造器 :必须有无参构造方法。
使用方式
- 使用jsp:useBean的方式创建javaBean实例
<jsp:useBean id=“对象名” scope=“保存范围 class=“包名.类名” /> 保存范围有:page|request|sessin|application,默认为page范围。
- 使用jsp:setProperty的方式设置javaBean的属性值,存入session
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
- 使用jsp:getProperty的方式获取javaBean的属性值
<jsp:getProperty name="对象名" property="属性名"/>
- 示例一
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>JavaBean组件的使用</title> </head> <body> <%-- 表示创建Student类型的对象由student引用变量负责记录 有效范围是当前页面 --%> <jsp:useBean id="student" scope="page" class="com.nxy.demo02.Student"/> <%-- 表示将student对象中名字为id的属性值设置为1002 --%> <jsp:setProperty name="student" property="id" value="1002"/> <jsp:setProperty name="student" property="name" value="guanyu"/> <% // 创建Student类型的对象并设置成员变量的数值 //Student student = new Student(); //student.setId(1001); //student.setName("zhangfei"); %> <%--<%= "获取到的学号是:" + student.getId() %> <%– 1001 1002 –%> <%= "获取到的姓名是:" + student.getName() %> <%– zhangfei guanyu –%>--%> 学号是:<jsp:getProperty name="student" property="id"/><br/> 姓名是:<jsp:getProperty name="student" property="name"/><br/> </body> </html>
- 示例二
bean2.jsp<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>实现向JavaBean组件传入参数的使用</title> </head> <body> <form action="bean2.jsp" method="post"> 学号:<input type="text" name="id1"/><br/> 姓名:<input type="text" name="name1"/><br/> <input type="submit" value="向JavaBean组件传参"/> </form> </body> </html>
获取信息<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>实现前端页面传入过来参数的接收和设置</title> </head> <body> <jsp:useBean id="student" scope="session" class="com.nxy.demo02.Student"/> <jsp:setProperty name="student" property="id" param="id1"/> <jsp:setProperty name="student" property="name" param="name1"/> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>实现JavaBean组件中对象属性值的打印</title> </head> <body> <jsp:useBean id="student" scope="session" class="com.nxy.demo02.Student"/> <%-- 获取名字为student对象中属性为id的数值并打印 --%> 经过参数赋值后获取到的学号是:<jsp:getProperty name="student" property="id"/><br/> 经过参数赋值后获取到的姓名是:<jsp:getProperty name="student" property="name"/><br/> </body> </html>
保存范围
- JavaBean的保存范围有page、request、session以及application,默认是page范围。
删除方式
<%
内置对象.removeAttribute(“JavaBean的名字”);
%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现JavaBean组件数据的删除</title>
</head>
<body>
<%
// 表示从session对象中删除名字为student的属性
session.removeAttribute("student");
%>
<%= "删除数据成功!" %>
</body>
</html>
MVC设计模式
- MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务
逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了
代码的可维护性。 - M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的
DAO对象。 - V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
- C:主要负责流程控制 和 页面跳转,通常由Servlet完成。
基本模型
示例:完成用户登录
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>实现简单的登录功能</title>
</head>
<body>
<form action="login" method="post">
用户名:<input type="text" name="userName"/><br/>
密 码:<input type="text" name="password"/><br/>
<span style="color: red"><%= request.getAttribute("error")==null?"":request.getAttribute("error")%></span><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
servlet
package com.nxy.demo03.servlet;
import com.nxy.demo03.bean.User;
import com.nxy.demo03.service.UserService;
import javax.servlet.RequestDispatcher;
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 java.io.IOException;
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取请求中的用户名和密码信息并打印出来
String userName = request.getParameter("userName");
System.out.println("获取到的用户名为:" + userName);
String password = request.getParameter("password");
System.out.println("获取到的密码为:" + password);
// 2.创建UserService类型的对象去实现数据的校验功能
UserService userService = new UserService();
User user = userService.userLoginService(new User(userName, password));
if (null == user) {
System.out.println("登录失败,用户名或密码错误!");
request.setAttribute("error", "登录失败,用户名或密码错误!");
// 实现服务器跳转 共享request和response对象
RequestDispatcher requestDispatcher = request.getRequestDispatcher("login.jsp");
requestDispatcher.forward(request, response);
} else {
System.out.println("登录成功,欢迎使用!");
// 将登录成功的用户信息放入session对象中实现多个请求共享
request.getSession().setAttribute("user", user);
// 实现客户端跳转
response.sendRedirect("main.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
DButil.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DbUtil {
private static String jdbcName; // 用于描述驱动信息
private static String dbUrl; // 用于描述URL信息
private static String dbUserName; // 用户描述用户名信息
private static String dbPassword; // 用户描述密码信息
// 进行静态成员的初始化操作
static {
jdbcName = "com.mysql.jdbc.Driver";
dbUrl = "jdbc:mysql://localhost:3306/db_web";
dbUserName = "root";
dbPassword = "123456";
try {
Class.forName(jdbcName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
Connection con = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
return con;
}
/**
* 关闭连接
* @param con
* @throws SQLException
*/
public static void closeResource(Connection con, PreparedStatement psts) throws SQLException {
if (null != con) {
con.close();
}
if (null != psts) {
psts.close();
}
}
}
dao
import com.nxy.demo03.bean.User;
public interface UserDao {
// 自定义抽象方法描述登录功能的实现
public abstract User userLogin(User user);
}
package com.nxy.demo03.dao;
import com.nxy.demo03.bean.User;
import com.nxy.demo03.util.DbUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImp implements UserDao {
@Override
public User userLogin(User user) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 1.获取数据库连接
connection = DbUtil.getConnection();
// 2.准备sql语句
String sql = "select * from t_user where userName = ? and password = ?";
// 3.执行sql语句后获取结果并返回
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUserName());
preparedStatement.setString(2, user.getPassword());
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
User tu = new User(resultSet.getString("userName"), resultSet.getString("password"));
return tu; // 表示查找成功
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 4.释放相关的资源
try {
DbUtil.closeResource(connection, preparedStatement);
if (null != resultSet) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null; // 表示查找失败
}
}
bean
package com.nxy.demo03.bean;
public class User {
private int id;
private String userName;
private String password;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
factory
package com.nxy.demo03.factory;
import com.nxy.demo03.bean.User;
import com.nxy.demo03.dao.UserDao;
import com.nxy.demo03.dao.UserDaoImp;
public class UserDaoFactory {
/**
* 通过静态工程方法模式来实现UserDao实现类对象的创建并返回
* @return
*/
public static UserDao getUserDao() {
return new UserDaoImp();
}
}
service(servlet与dao解耦)
package com.nxy.demo03.service;
import com.nxy.demo03.bean.User;
import com.nxy.demo03.dao.UserDao;
import com.nxy.demo03.factory.UserDaoFactory;
public class UserService {
private UserDao userDao;
public UserService() {
this.userDao = UserDaoFactory.getUserDao();
}
/**
* 自定义成员方法实现根据参数指定的User对象来调用DAO层实现登录功能
* @param user
* @return
*/
public User userLoginService(User user) {
return userDao.userLogin(user);
}
}
test
package com.nxy.demo03.test;
import com.nxy.demo03.bean.User;
import com.nxy.demo03.dao.UserDao;
import com.nxy.demo03.dao.UserDaoImp;
import com.nxy.demo03.service.UserService;
public class UserServiceTest {
public static void main(String[] args) {
UserDao userDao = new UserDaoImp();
UserService userService = new UserService();
User admin = userService.userLoginService(new User("admin", "1234566"));
System.out.println("找到的数据为:" + admin);
}
}