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
- 实现Servlet接口
- 继承GenericServlet类
- 继承HttpServlet类
Servlet中主要方法
- init():Servlet的初始化方法,仅仅会执行一次
- service():处理请求和生成响应
- destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次
- ServletRequest:
- 封装客户的请求信息
- 作用相当于JSP内置对象request
- ServletResponse
- 创建响应信息,将处理结果返回给客户端
- 作用相当于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:控制器调控模型和视图的联系,它控制应用程序的流程,处理事件并作出响应,事件不仅仅包括用户的行为还有数据 模型上的改变。通过捕获用户事件,通知模型层作出相应的更新处理,同时将模型层的更新和改变通知给视图,使得视图作出相应改变。因此控制器保证了视图和模 型的一致性。
操作
- 新建一个model包,里面放置由数据库中的数据表转化而来的类,一个数据表对应一个类
- 建立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;
}
}
- 新建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);
}
- 建立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配置。