看这个------------Servlet知识个人小结

Servlet初识

Servlet是用来接收并处理浏览器发出的请求用的后端程序。

创建Servlet的全过程:

1.创建一个普通的java类,继承javax.servlet.http.HttpServlet
2.重写两个方法,分别为 doGet和doPost方法
这个两个方法为servlet处理请求的核心方法
3.将方法中默认自带的内容全去掉
4.修改方法中的变量名,修改为 request response
5.完成方法体
6.在web.xml中对servlet进行配置工作

打开浏览器要访问一个Servlet,如:

http://localhost:8080/servlet1/myServlet1.do

浏览器的访问路径,在到达服务器后,会被系统拆分为两部分

第一部分:从开始到项目名 http://localhost:8080/servlet1 后面没有 /
第二部分:第一部分剩下的部分 /myServlet1.do 前面一定是有 / 的

Servlet家族继承结构
Servlet ------>太抽象了,好多东西要重写
| | 实现
| |
GenericServlet -------->对Servlet进行了很多方法的重写
| |继承
| |
HttpServlet
| |继承
| |
MyServlet1 ----->(自定义的Servlet)

Servlet中我们直接使用的方法是doGet()和doPost()方法。比较常用的就是doGet()方法。

Servlet的生命周期
生命周期:类所创建出来的对象从创建到销毁的全过程。

Servlet的生命周期:servlet对象从创建到销毁的全过程。

(1)服务器启动,servlet对象不创建
(2)浏览器发出请求,路径到达服务器的项目,如果用到了指定的Servlet来处理请求,则服务器会自动为我们创建出来一个servlet对象来处理请求
(3) servlet 对象创建完毕后,马上调用 init 方法,执行对象的初始化操作。
(4) servlet对象在创建完毕后,是以单例的形式存储在服务器上。
第 2~n 次访问的时候,就不重新创建对象了,而是使用一次访问创建出来的单例对象
(5) 浏览器发出的请求,由 servlet 中的 doGet/doPost 方法来处理请求。
(6) 关闭服务器,servlet 对象销毁
(7) 在 servlet 对象销毁之前,调用 destory 方法执行最后的处理工作。
(8) 加入 load-on-startup 可以更改 servlet 对象的创建时机,由以前的用到时才创建(懒汉)更改为启动服务器就创建(饿汉)。
(9) servlet 中的单例其实是一种假单例
因为 servlet 对象没有进行构造方法私有化的操作,是能够在其他的类中随意创建的(我们自己手动创建 servlet 对象没有任何意义)。

处理Servlet时会出现的错误

服务器启动时报错 服务器中有项目,服务器启动报错,肯定是项目中的 web.xml配置语法错误
(1) url-pattern 前面没有加/
(2) servlet-name 配置错误
(3) 启动服务器没有错误,但是访问时报 500 错误表示找不到的servlet 类

需要重启服务器的操作

(1) 修改前端文件,不用重新启动服务器
(2) 修改后台 servlet,不用重新启动服务器,但是需要等待 java 文件重新编译成class 文件的过程
( 3)修改 web.xml,必须重新启动服务器

get和post提交方式

这个其实是很重要的,单拿出来。
这两种请求方式是基于HTTP协议的。

get:
(1)浏览器地址栏输入访问路径,敲回车,发出请求到服务器,这 种请求方式为 get 请求方式,请求发送到后台,执行 doGet 方法来处理请求。
(2) 点击超链接,发出请求到服务器,这种请求方式为 get 请求方 式,请求发送到后台,执行 doGet 方法来处理请求。
(3) 提交表单,发出请求到服务器,这种请求方式为 get 请求方式, 请求发送到后台,执行doGet 方法来处理请求。
post:
(1)提交表单,表单中需要设置 method=“post”

参数的传递和接收
get 请求方式是以路径后面挂参数的形式传递参数的(请求行的方式)

post 请求方式是以隐藏的形式来传递参数(请求体的方式)

get:
url?key1=value1&key2=value2&key3=value3 (如果提交表单表单元素中的 name 属性为 key我们填写的内容为 value)

post:
参数是不显示的挂在路的后面

所以get会出现一个问题,就是浏览器路径行位置超出可容纳最大字符数,post则不会有这样的问题。

get提交和post提交的区别

get提交:
(1) 参数提交,显示的挂参数
a.安全性 低
b.大量参数的传递 有可能参数传递的不全
(2) 参数的中文支持性
如果使用较低版本的 tomcat,那么中文参数是会出现乱码的 (一般不会出现这个问题了)
(3)执行效率 相对较高

post提交:
(1)参数提交,隐藏地挂参数
a.安全性高
b.大量参数的传递,没有问题
(2)参数的中文支持性
后台接收中文参数,出现了中文乱码
解决方法:Servlet中加入以下代码
request.setCharacterEncoding(“UTF-8”);
(注意只针对post请求)
(3)执行效率 相对较低

对于 get 和 post 提交方式的使用选择
在实际项目开发中,如果没有出现安全性问题,如果没有出现大量的参数的传递问题,我们推荐使用 get 请求方式,执行效率较高否则一律使用 post 请求方式

url-pattern

路径问题

精确路径匹配:/abc/myServlet1.do

部分路径匹配:/abc/*

通配符匹配:/*

后缀名匹配:*.do

注意:

(1).do 前面不加/,其他的所有路径前面必须加/
(2)/abc/
.do 这种路径不存在
(3)abc/.do 这种路径不存在
只要是使用后缀名形式的匹配,只有
.do 一种表现形式

优先级问题

如果浏览器发出的请求,路径与web.xml 中的多个url-pattern都匹配,只能执行其中的一个 servlet 来处理我们的请求。
选择 servlet 的原则是根据 url-pattern 匹配路径的优先级来的。

精确路径匹配 > 部分路径匹配 > 统配符匹配 > 后缀名匹配

响应流

基本使用:
在这里插入图片描述
响应中文信息
在这里插入图片描述
第一感觉,很麻烦!!!
拼接这个那得多难受

响应流一个练习

完成登录操作,如果登录成功,则在页面上打印学生信息列表,如果登录失败,则在页面打印失败信息
项目工程成名就叫 servlet3 吧 不拘小节

数据库
在这里插入图片描述在这里插入图片描述工具类
DBUtil.java

package com.util;

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

public class DBUtil {
	
	//私有化,不能创建出对象,只能直接用类来调用方法
	private DBUtil(){}
	
	static{
		//执行jdbc之前加载驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	
	private static final String URL = "jdbc:mysql://localhost:3306/test";
	private static final String USER = "root";
	private static final String PASSWORD = "root";
	
	//取得连接
	public static Connection getConn() throws SQLException{
		
		Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
		
		return conn;
		
	}

	//关闭资源
	public static void myClose(Connection conn,PreparedStatement ps,ResultSet rs) throws SQLException{
		
		//关闭的顺序为按照 创建的顺序  逆序关闭
		if(rs!=null){
			
			rs.close();
			
		}
		
		if(ps!=null){
			
			ps.close();
			
		}

		if(conn!=null){
	
			conn.close();
	
		}
		
	}

}

字段类
Student.java

package com.domain;

public class Student {
	
	private String id;
	private String name;
	private int age;
	
	public Student(){}
	
	public Student(String id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

登录
前端html
login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h3>我是登录页</h3>
	<form action="/servlet3/login.do" method="post">
		
		账号:<input type="text" name="username"/><br/><br/>
		密码:<input type="text" name="password"/><br/><br/>
		
		<input type="submit" value="提交"/>
		
	</form>
	
</body>
</html>

后端Servlet
LoginServlet.java

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

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

import com.domain.Student;
import com.util.DBUtil;

public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("进入到登录操作");
		
		response.setContentType("text/html;charset=utf-8");
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		System.out.println(username);
		System.out.println(password);
		
		/*
		 * 账号密码接收完毕
		 * 连jdbc,在tbl_user表中验证 以上username和password
		 */
		
		/*
		 * 声明所需变量
		 * 搭建jdbc所需的try..catch..finally结构 主要处理SQLException
		 * 
		 * 在以上搭建的结构中,连jdbc,完成业务逻辑
		 * 
		 */
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select count(*) from tbl_user where username=? and password=?";
		boolean flag = true;
		
		try{
			
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			/*
			 * 创建完ps之后,养成好习惯,观察sql语句,如果有?,需要使用ps对?进行赋值
			 */
			ps.setString(1,username);
			ps.setString(2,password);
			
			rs = ps.executeQuery();
			
			if(rs.next()){
				
				int count = rs.getInt(1);
				/*
				 * count==0 没有查询出相应的账号密码  登录失败
				 * count==1 查询出来了一条记录  登录成功
				 * count>1 有垃圾数据 登录失败
				 * 
				 */
				if(count!=1){
					flag = false;
				}
				
			}
			
			
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			
			try {
				DBUtil.myClose(conn, ps, rs);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
		/*
		 * 以上为连jdbc,判断账号密码是否正确
		 * 以下为根据flag值,决定登录成功还是失败
		 */
		
		//登录成功
		if(flag){
		
			/*PrintWriter out = response.getWriter();
			out.print("登录成功");
			out.close();*/
			
			Connection conn1 = null;
			PreparedStatement ps1 = null;
			ResultSet rs1 = null;
			String sql1 = "select id,name,age from tbl_student";
			List<Student> sList = new ArrayList<Student>();
			
			try{
				
				conn1 = DBUtil.getConn();
				ps1 = conn1.prepareStatement(sql1);
				rs1 = ps1.executeQuery();
				
				while(rs1.next()){
					
					Student s = new Student();
					
					s.setId(rs1.getString(1));
					s.setName(rs1.getString(2));
					s.setAge(rs1.getInt(3));
					
					sList.add(s);
					
				}
				
			}catch(SQLException e){
				e.printStackTrace();
			}finally{
				
				try {
					DBUtil.myClose(conn1, ps1, rs1);
				} catch (SQLException e) {
					e.printStackTrace();
				}
				
			}
			
			/*
			 * 以上为连jdbc,取学生列表sList的过程
			 * 以下为将sList通过响应流展现在浏览器上
			 */
			 //拼接这个你觉得怎么样???
			PrintWriter out = response.getWriter();
			out.print("<html>");
			out.print("<body>");
			out.print("<table border='1'>");
			
			
			out.print("<tr>");
			
			out.print("<td>");
			out.print("序号");
			out.print("</td>");
			
			out.print("<td>");
			out.print("编号");
			out.print("</td>");
			
			out.print("<td>");
			out.print("姓名");
			out.print("</td>");
			
			out.print("<td>");
			out.print("年龄");
			out.print("</td>");
			
			out.print("</tr>");
			
			for(int i=0;i<sList.size();i++){
				
				//取得每一个学生
				Student s = sList.get(i);
				
				out.print("<tr>");
				
				out.print("<td>");
				out.print(i+1);
				out.print("</td>");
				
				out.print("<td>");
				out.print(s.getId());
				out.print("</td>");
				
				out.print("<td>");
				out.print(s.getName());
				out.print("</td>");
				
				out.print("<td>");
				out.print(s.getAge());
				out.print("</td>");
				
				out.print("</tr>");
				
			}
					
			out.print("</table>");
			out.print("</body>");
			out.print("</html>");
			out.close();
					
		//登录失败	
		}else{
			
			PrintWriter out = response.getWriter();
			out.print("登录失败");
			out.close();
			
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}

}

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">
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
   <servlet>
  	<servlet-name>login</servlet-name>
  	<servlet-class>com.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>login</servlet-name>
  	<url-pattern>/login.do</url-pattern>
  </servlet-mapping>

</web-app>

结果:
登录成功:
在这里插入图片描述
登录失败:
在这里插入图片描述

转发和重定向

转发:转发后,路径不会发生变化,仍然为访问当前servlet路径。
原理一次请求,一次响应

路径为最后一次请求的路径(唯一的一次请求的路径)

在这里插入图片描述

语法
取得转发对象:
RequestDispatcher rd = request.getRequestDispatcher(“方法中的参数,就是我们需要跳转的路径”);

比如我们现在要通过转发跳转到根路径下的index.html

RequestDispatcher rd = request.getRequestDispatcher("/index.html");
//使用转发对象进行转发操作
rd.forward(request, response);

对于路径的使用:http://localhost:8080/servlet1/index.html
项目中的路径使用绝对路径,以 /项目名 开头

!!!转发的路径是一种特殊的绝对路径前面是不加 /项目名 的,这种路径也叫做内部路径/index.html,注意前面有 /

转发的几种情况:

1.转发到普通的html页面

request.getRequestDispatcher("/index.html").forward(request,response);

2.通过转发的形式来访问WEB-INF下的资源 (正常情况下是访问不到的,通过转发的形式是唯一能够访问到WEB-INF下的资源的方式)

单纯理解:转发后,路径为老路径,所以路径上没有出现WEB-INF这几个字符,所以能够访问到

request.getRequestDispatcher("/WEB-INF/html/index.html").forward(request,response);

3.转发到另一个servlet (如果转发到另一个servlet,路劲的写法其实就是url-pattern)

request.getRequestDispatcher("/myServlet2.do").forward(request,response);



重定向:重定向后,路径为新路径,为跳转后的资源的路径。
原理两次请求,两次响应

路径停在最后一次请求上

在这里插入图片描述

语法:
response.sendRedirect(“方法中的参数为,跳转的路径”);

重定向的路径的写法,为传统的绝对路径的写法,必须以 /项目名 开头

重定向的几种情况:

1.重定向到一个普通的html页面

response.sendRedirect("/项目名/index.html");

2.重定向到WEB-INF下的资源

response.sendRedirect("/项目名/WEB-INF/html/index.html");

3.重定向到另一个servlet

response.sendRedirect("/项目名/myServlet4.do");

ServletConfig对象(上下文对象)

概述: 上下文对象是项目中的全局管理者。

生命周期: 在服务器启动的时候,服务器会自动的为我们创建出来一个上下文对象,这个上下文对象是以单例的形式,始终存储在服务器上。当服务器关闭,上下文对象销毁。

作用范围: 上下文对象可以应用在所有的 servlet 当中,为所有的 servlet 提供服务。

如何取得上下文对象?
方式1:

ServletContext application = this.getServletConfig().getServletContext();
注意:上下文变量的名字 application (一般使用这个,看个人习惯)

方式2:

ServletContext application = this.getServletContext();
一般使用第二种方式,因为比较简单

上下文对象几个实例

1.通过上下文对象取得全局参数

ServletContext application = this.getServletContext();
String str1 = application.getInitParameter(“encoding”);
System.out.println(str1);
request.setCharacterEncoding(str1);
response.setContentType(“text/html;charset=”+str1);

值得注意:全局参数在web.xml

<!-- 
  	以下为配置全局参数
  	全局参数可以作用于每一个servlet
  	所有的servlet都可以使用下面配置的全局参数
   -->
<context-param>
  	<param-name>encoding</param-name>
  	<param-value>utf-8</param-value>
  </context-param>

2.上下文对象 当做域对象来存取值

ServletContext application = this.getServletContext();
application.setAttribute(“str1”,“abc”);

3.获取项目发布路径

ServletContext application = this.getServletContext();
String path =application.getRealPath("/");
System.out.println(path);

上下文对象常用方法

(1)获得全局初始化参数

getInitParameter(String key)

搭配 web.xml 中的配置

<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>

(2) 作为域对象存取数据

servlet 中域对象共有 3 种(request,session,application)
上下文是其中一种

域对象的作用是,用来做存取值操作的。

上下文域对象的取值范围是 3 个域对象中最广的。

当将值存放到上下文域对象中之后,只有当域对象销毁,里面的值才随之销毁。作为上下文对象,关闭服务器,上下文对象才销毁。当我们将值存放到上下文域对象中,之后,只有当服务器关闭,值才会随着上下文对象的销毁而消失掉

作为域对象有以下几种代码实现方式:

存值:域对象.setAttribute(String key,Object obj)
取值:域对象.getAttribute(String key) Object
移除值:域对象.removeAttribute(String key) --> 不常用

(3)获取项目发布路径

getRealPath("/")

ServletConfig 对象

概述:当 Servlet 对象创建完毕后马上执行 init 方法对 Servlet 对象进行初始化操作,初始化操作的其中一项就是,将 Servlet 对象所对应的包装类型对象创建出来,也就是 ServletConfig 对象。 (每一个 Servlet 对象的出生,都会搭配一个 ServletConfig 对象进行装饰)

ServletConfig 对象取得方式

ServletConfig config = this.getServletConfig();
变量名:config

几个实例

1.取得web.xml中的servlet-name

ServletConfig config = this.getServletConfig();
String sname = config.getServletName();
System.out.println(sname);

2.取得当前servlet配置的初始化参数

ServletConfig config = this.getServletConfig();
String str1 = config.getInitParameter(“encoding”);
System.out.println(str1);
request.setCharacterEncoding(str1);

<servlet>
    <servlet-name>myServlet3</servlet-name>
    <servlet-class>com.servlet.MyServlet3</servlet-class>
    <!-- 
    	该参数只能应用在当前servlet中  (内置参数)
     -->
    <init-param>
    	<param-name>encoding</param-name>
    	<param-value>utf-8</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>myServlet3</servlet-name>
    <url-pattern>/myServlet3.do</url-pattern>
  </servlet-mapping>

3.通过ServletConfig对象取得上下文对象

ServletContext application = this.getServletConfig().getServletContext();

Servlet线程安全问题

在 servlet 中使用成员变量,会出现线程的安全性问题
于成员变量,没有需求会使用到 servlet 中的成员变量,所以为了避免 servlet 的线程的安全性问题,就不使用成员变量就可以了。(少遇见)

最后练习

验证登录,当我们登录失败,提示"用户名密码不匹配",3秒以后跳转到登录页面,若登录成功,可查看学生列表
项目工程名就叫 servlet1 吧 不拘小节

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>servlet1</display-name>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
    <servlet-name>studentList</servlet-name>
    <servlet-class>com.servlet.StudentListServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>studentList</servlet-name>
    <url-pattern>/student/list.do</url-pattern>
  </servlet-mapping>
  
</web-app>

数据库
如上
工具类
如上
字段类
如上

登录
前端html
login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h3>我是登录页</h3>
	<form action="/servlet1/login.do" method="post">
		
		账号:<input type="text" name="username"/><br/><br/>
		密码:<input type="text" name="password"/><br/><br/>
		
		<input type="submit" value="提交"/>
		
	</form>
	
</body>
</html>

这个有一个登录失败,3秒后跳转的需求,所以再建一个失败的前端html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta http-equiv="refresh" content="3;url=/servlet1/login.html">
<script type="text/javascript">

	function djs(){
		
		window.setInterval("myMath()",1000);
		
	}
	
	function myMath(){
		
		document.getElementById("msg").innerHTML = document.getElementById("msg").innerHTML-1;
		
	}
	

</script>
</head>
<body onload="djs()">
	
	登录失败,<span id="msg">3</span>秒钟后跳转到登录页
	
</body>
</html>

处理登录的后端servlet
LoginServlet.java

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

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

import com.domain.Student;
import com.util.DBUtil;

public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("进入到登录操作");
		
		response.setContentType("text/html;charset=utf-8");
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		System.out.println(username);
		System.out.println(password);
		
		/*
		 * 账号密码接收完毕
		 * 连jdbc,在tbl_user表中验证 以上username和password
		 */
		
		/*
		 * 声明所需变量
		 * 搭建jdbc所需的try..catch..finally结构 主要处理SQLException
		 * 
		 * 在以上搭建的结构中,连jdbc,完成业务逻辑
		 * 
		 */
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select count(*) from tbl_user where username=? and password=?";
		boolean flag = true;
		
		try{
			
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			/*
			 * 创建完ps之后,养成好习惯,观察sql语句,如果有?,需要使用ps对?进行赋值
			 */
			ps.setString(1,username);
			ps.setString(2,password);
			
			rs = ps.executeQuery();
			
			if(rs.next()){
				
				int count = rs.getInt(1);
				/*
				 * count==0 没有查询出相应的账号密码  登录失败
				 * count==1 查询出来了一条记录  登录成功
				 * count>1 有垃圾数据 登录失败
				 * 
				 */
				if(count!=1){
					flag = false;
				}
				
			}
			
			
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			
			try {
				DBUtil.myClose(conn, ps, rs);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
		/*
		 * 以上为连jdbc,判断账号密码是否正确
		 * 以下为根据flag值,决定登录成功还是失败
		 */
		
		//登录成功
		if(flag){
		
			/**
			 * 登录成功后,跳转到/student/list.do
			 * 
			 * 转发还是重定向
			 * 我们登录成功,要刷新的是学生列表本身,而不是登录操作
			 * 所以使用的是重定向
			 */
			response.sendRedirect("/servlet1/student/list.do");
			
			
			
		//登录失败	
		}else{
	
			/**
			 * 失败后跳转到失败页 再跳转到登录页
			 * 使用转发还是重定向在于是否能得到有效的刷新
			 * 我们要刷新的是页面本身,所以使用的是重定向
			 */
			response.sendRedirect("/servlet1/fail.html");
			
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}

}

SrudentListServlet.java

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

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

import com.domain.Student;
import com.util.DBUtil;

public class StudentListServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("进入到学生信息列表操作");
		
		response.setContentType("text/html;charset=utf-8");
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select id,name,age from tbl_student";
		List<Student> sList = new ArrayList<Student>();
		
		try{
			
			conn = DBUtil.getConn();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			while(rs.next()){
				
				Student s = new Student();
				
				s.setId(rs.getString(1));
				s.setName(rs.getString(2));
				s.setAge(rs.getInt(3));
				
				sList.add(s);
				
			}
			
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			
			try {
				DBUtil.myClose(conn, ps, rs);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
		
		/*
		 * 以上为连jdbc,取学生列表sList的过程
		 * 以下为将sList通过响应流展现在浏览器上
		 */
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<body>");
		out.print("<table border='1'>");
		
		
		out.print("<tr>");
		
		out.print("<td>");
		out.print("序号");
		out.print("</td>");
		
		out.print("<td>");
		out.print("编号");
		out.print("</td>");
		
		out.print("<td>");
		out.print("姓名");
		out.print("</td>");
		
		out.print("<td>");
		out.print("年龄");
		out.print("</td>");
		
		out.print("</tr>");
		
		for(int i=0;i<sList.size();i++){
			
			//取得每一个学生
			Student s = sList.get(i);
			
			out.print("<tr>");
			
			out.print("<td>");
			out.print(i+1);
			out.print("</td>");
			
			out.print("<td>");
			out.print(s.getId());
			out.print("</td>");
			
			out.print("<td>");
			out.print(s.getName());
			out.print("</td>");
			
			out.print("<td>");
			out.print(s.getAge());
			out.print("</td>");
			
			out.print("</tr>");
			
		}

		out.print("</table>");
		out.print("</body>");
		out.print("</html>");
		out.close();
		
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}

}

个人的学习总结。

结束语

业精于勤,荒于嬉。 -----《进学解》韩愈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值