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);
}
}
个人的学习总结。
结束语
业精于勤,荒于嬉。 -----《进学解》韩愈