Servlet与JDBC的学习

Servlet

Servlet是什么?

  • Server+Applet,是一种服务器端的Java应用程序
  • 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet

Servlet做了什么?

  • 本身不做任何业务处理
  • 只是接收请求并决定调用哪个JavaBean去处理请求
  • 确定用哪个页面来显示处理返回的数据
    在这里插入图片描述

JSP与Servlet之间有什么关系?

在这里插入图片描述

主要Servlet API介绍

  • javax.servlet.Servlet接口:
    所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集

  • javax.servlet.GenericServlet类
    是Servlet的通用版本,是一种与协议无关的Servlet

  • javax.servlet.http.HttpServlet类
    在GenericServlet基础上扩展的基于Http协议的Servlet

  • 如何创建Servlet

  1. 实现Servlet接口
  2. 继承GenericServlet类
  3. 继承HttpServlet类

Servlet中主要方法

  • init():Servlet的初始化方法,仅仅会执行一次
  • service():处理请求和生成响应
  • destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次
  • ServletRequest:
  1. 封装客户的请求信息
  2. 作用相当于JSP内置对象request
  • ServletResponse
  1. 创建响应信息,将处理结果返回给客户端
  2. 作用相当于JSP内置对象response
  • ServletConfig:包含了servlet的初始化参数信息

Servlet生命周期

生命周期谁来做何时做
实例化Servlet容器当Servlet容器启动或者容器检测到客户端请求时
初始化Servlet容器实例化后,容器调用Servlet的init()初始化对象
处理请求Servlet容器得到客户端请求并做出处理时
销毁Servlet容器当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候

在这里插入图片描述

部署运行Servlet

例题 Servlet实现登录
新建一个index.jsp,实现登录界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<%  //使用Cookie保存用户名
String userName="";
Cookie[] cookies=request.getCookies();//得到cookie
if(cookies!=null && cookies.length>0){
	for(Cookie c:cookies){
		if("userName".equals(c.getName())){//获得cookie的key
			userName=c.getValue();	//获得cookie的value
		}
	}
}
%>
</head>
<body>
<form action="/web05/loginServlet" method="post">
姓名:<input type="text" name="userName" value="<%=userName %>" /><br />
密码:<input type="password" name="userPassword" /><br />
<input type="submit" value="subMe!" />
</form>
</body>
</html>

新建LoginServlet.java文件,在这对用户进行验证

package com.java.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 如果要让一个普通的类 变成servlet 
 * 就让他继承javax.servlet.http.HttpServlet
 * @author naixi
 *
 */
public class LoginServlet extends HttpServlet {
	//com.java.servlet.LoginServlet
	/**
	 * 这个方法 就是专门用来处理 get方式的请求 所有的get请求都会被传递到这个方法内
	 * 你所需要的request和response作为参数传递进来了 你只要用就可以了
	 */
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		// 从表单 获取数据 
		String userName=req.getParameter("userName");
		String userPassword=req.getParameter("userPassword");
		if("jack".equals(userName) && "333".equals(userPassword)) {
			//cookie
			Cookie cookie=new Cookie("userName",userName);
			cookie.setMaxAge(60*5);
			resp.addCookie(cookie);
			//session 在servlet中 是问req拿的
			HttpSession session=req.getSession();
			session.setAttribute("userName", userName);
			
			
			resp.sendRedirect("/web05/welcome.jsp");
		}else {
			resp.sendRedirect("/web05");
		}
		
		
		// 将数据传递给下一个页面
		//  cookie session
		
	}
	/**
	 * 专门用来处理post请求
	 */
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req,resp);
	}
	
}

建立welcome.jsp,如果登录成功跳转到此页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎界面</title>
</head>
<body>
<h1>欢迎您!<%=session.getAttribute("cu_name") %></h1>

</body>
</html>

然后在此目录下打开web.xml,初始化参数设置
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>web05</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file><!--默认的显示页面-->
  </welcome-file-list>
  
  <servlet>
    <servlet-name>loginServlet</servlet-name><!--Servlet名称唯一-->
    <servlet-class>com.java.servlet.LoginServlet</servlet-class><!--Servlet类所在路径-->
  </servlet>
  
  <servlet-mapping>
    <servlet-name>loginServlet</servlet-name><!--与<servlet>的<servlet-name>设置相同-->
    <url-pattern>/loginServlet</url-pattern><!--访问Servlet的URL,-->
  </servlet-mapping>
  
  <servlet>
    <servlet-name>logoutServlet</servlet-name>
    <servlet-class>com.java.servlet.LogoutServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>logoutServlet</servlet-name>
    <url-pattern>/logoutServlet</url-pattern>
  </servlet-mapping>

</web-app>

在这里插入图片描述

使用JDBC操作数据库

JDBC是什么

  • Java数据库连接技术(Java DataBase Connectivity),
    能实现Java程序对各种数据库的访问
  • 由一组使用Java语言编写的类和接口(JDBC API)组成,它们位于java.sql以及javax.sql中
    在这里插入图片描述

JDBC访问数据库步骤

在这里插入图片描述

为什么要使用JDBC

1、将相似功能的代码抽取封装成方法,减少代码冗余
2、因为不同的数据库会有不同的实现,对数据库的操作一般抽取成接口,在以后的开发中可以降低耦合

如何使用

将jdbc的jar包放入服务器

在这里插入图片描述

使用JDBC要点

  • PreparedStatement由方法prepareStatement()创建,
    该对象用于发送带有一个或者多个输入参数的SQL语句
  • SQL语句使用“?”作为数据占位符
  • 使用setXxx()方法设置数据
  • PreparedStatement—预编译
    -效率、性能、开销
    -安全性
    -代码可读性

使用JDBC实现登录

Web前端MVC框架

MVC:

模型层(model)、视图层(view)、控制层(controller)

Model:即数据模型,用来包装和应用程序的业务逻辑相关的数据或者对数据进行处理,模型可以直接访问数据。

View:视图用来有目的显示数据,在视图中一般没有程序上的逻辑,为了实现视图上的最新功能,视图需要访问它监视的数据模型。

Controller:控制器调控模型和视图的联系,它控制应用程序的流程,处理事件并作出响应,事件不仅仅包括用户的行为还有数据 模型上的改变。通过捕获用户事件,通知模型层作出相应的更新处理,同时将模型层的更新和改变通知给视图,使得视图作出相应改变。因此控制器保证了视图和模 型的一致性。

操作
  1. 新建一个model包,里面放置由数据库中的数据表转化而来的类,一个数据表对应一个类
  2. 建立util工具包,放置jdbc对数据库的访问,如:
package com.ishopn.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * 这个类 是我们的数据库访问的工具类
 * 将数据库连接使用的的公用的部分抽离出来 
 *     获取数据库连接
 *     关闭数据库连接
 *     统一的查询方法
 *     统一的更新方法
 * @author naixi
 *
 */
public class DBHelper {
	private static String url="jdbc:mysql://localhost:3306/ishopn?characterEncoding=utf8";
	private static String user="root";
	private static String password="1234";
	
	/**
	 * 获取数据库连接对象
	 * @return 数据库连接对象
	 */
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	 * 统一的关闭数据库连接对象
	 * @param conn  数据库连接实例对象
	 */
	public static void closeConnection(Connection conn) {
		if(conn!=null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
	/**
	 * 通用的查询方法
	 * @param conn 数据库连接对象
	 * @param sql  需要执行的sql语句
	 * @param param  sql语句中需要替换的参数列表
	 * @return   ResultSet资源结果集
	 */
	public static ResultSet executeQuery(Connection conn,String sql,List param) {
		ResultSet rs = null;
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			if(param!=null && param.size()>0) {
				for(int i=0;i<param.size();i++) {
					ps.setObject(i+1, param.get(i));
				}
			}
			rs = ps.executeQuery();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	
	/**
	 * 通用的更新方法
	 * @param conn  数据库连接对象
	 * @param sql   数据库查询语句
	 * @param param 需要替换的参数
	 * @return      受影响行数
	 */
	public static int executeUpdate(Connection conn,String sql,List param) {
		int line=0;
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			if(param!=null && param.size()>0) {
				for(int i=0;i<param.size();i++) {
					ps.setObject(i+1, param.get(i));
				}
			}
			line = ps.executeUpdate();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return line;
	}
	
}

  1. 新建dao包,放置表的数据库操作 (接口),如
	package com.ishopn.dao;

import com.ishopn.model.Customer;

/**
 * 对哪张表的数据库操作 就书写在对应的Dao中
 * 登录和注册
 *     我们约定 数据库访问的时候方法的名称
 *     select > get...
 *     insert > ist...
 *     delete > del...
 *     update > upd...
 * @author naixi
 *
 */
public interface CustomerDao {
	int getCountCustomerByNameAndPhone(Customer cu);
	int istCustomer(Customer cu);
}

  1. 建立dao包的实现包,如:
package com.ishopn.dao.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ishopn.dao.CustomerDao;
import com.ishopn.model.Customer;
import com.ishopn.util.DBHelper;

public class CustomerDaoImpl implements CustomerDao {

	@Override
	public int getCountCustomerByNameAndPhone(Customer cu) {
		int count=0;
		try {
			// 1 获取数据库连接
			Connection conn = DBHelper.getConnection();
			// 3 编写sql命令
			String sql="select count(*) from customer where cu_name=? and cu_phone=?";
			List param = new ArrayList();
			param.add(cu.getCu_name());
			param.add(cu.getCu_phone());
			// 4 执行命令 返回资源结果集
			ResultSet rs = DBHelper.executeQuery(conn, sql, param);
			rs.next();
			count=rs.getInt(1);
			// 2 关闭数据库连接
			DBHelper.closeConnection(conn);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return count;
	}

	@Override
	public int istCustomer(Customer cu) {
		// TODO Auto-generated method stub
		return 0;
	}

}

5.建立servlet包,实现 交互式地浏览和生成数据,生成动态Web内容
6. 建立xxController调控模型和视图的联系
7. 建立所要实现的html。要记得在web.xml文件中进行servlet配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值