servlet作用分析
浏览器提交url请求,tomcat服务器根据url路径调用指定的servlet程序处理请求与响应,所以servlet的作用是
作用:处理请求与响应
开始servlet2.5实现步骤
- 使用idea创建web应用程序,web项目
- 创建一个类Demo1Servlet继承HttpServlet重写doGet方法处理用户的请求与响应数据给浏览器
- 编辑web.xml配置文件配置用户访问url与我们自己创建的Demo1servlet类建立映射关系,保证用户请求的url到指定的java代码去执行
- 部署资源到服务器上.(使用idea工具部署项目)
实现详情
-
创建一个web应用程序,idea绑定配置tomcat服务器
web目录必须有蓝点,否则需要重新创建新的项目
-
创建一个新类继承HttpServlet,重写doGet处理请求方法进行处理请求与响应
package com.itheima.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class Demo1Servlet extends HttpServlet { /** * 用来处理get请求与响应 * request是请求对象,用来获取所有请求数据的 * response是响应对象,用来输出数据给浏览器的 */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //给浏览器输出一句“hello servlet2.5” //1.获取输出流可以输出数据给浏览器 PrintWriter out = response.getWriter(); //2.输出数据 out.write("hello servlet2.5"); } /* * 用来处理post请求与响应 * */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
配置web.xml让用户访问的路径找到servlet去执行处理请求与响应
如果没有web目录需要手动添加,添加步骤
在弹出窗口勾选“web application”,点击确定就会生成web目录
web.xml代码
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!--目标:配置用户访问的url与DemoServlet映射关系,目的是访问url就找到DemoServlet处理请求与响应 1.定义DemoServlet类全名 2.定义url关联DemoServlet url定义格式:/资源名字, /代表当前项目内,必须有 浏览器访问:http://localhost:8080/资源目录/资源名字 例子:http://localhost:8080/资源目录/demo --> <servlet> <servlet-name>DemoServlet</servlet-name> <servlet-class>com.itheima.servlet.DemoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DemoServlet</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping> </web-app>
-
部署项目
Application context设置部署的虚拟资源目录(不能有中文和特殊字符)
-
运行项目
idea2017
idea2019
-
浏览器访问动态资源
小结
配置文件方式:需要手动进行web.xml配置用户访问的路径与servlet进行映射
开发servlet的步骤:
- 创建类继承HttpServlet
- 重写doGet方法
- 配置web.xml
- 部署项目
12.Servlet开发体验2-Servlet3.0注解配置方式【应用】
目标
使用注解进行用户url与servlet映射
实现步骤
- 使用idea创建web应用程序
- 创建一个类Demo1Servlet继承HttpServlet重写doGet方法(我们自己的类就是Servlet),处理用户的请求与响应数据给浏览器
- 在Demo1Servlet类上面配置注解(配置url路径)
- 部署资源到服务器上.(使用idea工具部署项目)
实现详情
-
创建项目
-
创建Servlet并重写doGet方法
-
配置注解进行用户访问的url映射到servlet
package com.itheima.servlet; 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; import java.io.PrintWriter; /* * 注解方式给servlet绑定url * @WebServlet 注解 * name = "Demo1Servlet", 功能与web.xml中的<servlet-name>一样,这个属性可有可无 * urlPatterns = "/demo",功能与web.xml中的<url-pattern>一样,这个属性必须有 * */ @WebServlet(name = "Demo1Servlet",urlPatterns = "/demo") public class Demo1Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //给浏览器输出一句“hello servlet3.0” //1.获取输出流可以输出数据给浏览器 PrintWriter out = response.getWriter(); //2.输出数据 out.write("hello servlet3.0"); } }
-
重启服务器部署运行
-
浏览器访问
使用模板创建servlet类
好处:自动继承HttpServlet,自动重写doGet或doPost方法,自动完成注解
idea2017版本
idea2019版本
生成的代码
package com.itheima.servlet;
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 = "Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
默认的生成代码不会有urlPatterns = "/xxxx"
,需要修改idea工具关于servlet代码生成模板,修改如下:
配置模板操作步骤
添加的代码
,urlPatterns="/${Entity_Name}"
doGet(request,response);
修改模板后,重新使用模板生成的代码如下
编写代码Demo2Servlet
package com.itheima.servlet;
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 = "Demo2Servlet", urlPatterns = "/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello Demo2Servlet");
}
}
直接访问:http://localhost:8080/day24_04_servlet3_0_war_exploded/Demo2Servlet
会发生404,原因是没有部署
(当服务器启动后修改任何项目的资源都需要重新部署资源后才可以访问)
再次访问
Servlet3.0新特性
-
新增了一些注解,简化的 javaweb 代码开发,可以省略 web.xml 配置文件。
-
支持异步处理:多线程技术。
-
支持可插性特性:书写的代码编译后生成的 class 文件可以直接部署到其他项目自动加载执行。
servlet2.5写的java代码编译后放到服务器上,需要重启服务器
servlet3.0不需要,直接服务器识别
小结
-
servlet2.5与servlet3.0区别
2.5需要手动配置web.xml
3.0只需要配置注解
-
servlet程序与普通java类的区别
普通java类型需要main方法才能运行
servlet程序是有tomcat服务器调用的运行
12.idea开发工具web项目部署资源方式介绍【理解】
目标
学习idea将web项目部署到哪里去了?
实现步骤
-
idea部署web资源目录的位置
部署到webapps外部了,采用的是什么部署方式呢?独立xml虚拟目录方式
小结
idea部署的项目采用独立xml虚拟目录方式
13.Servlet体系结构【理解】
目标
了解servlet的结构,不仅仅有HttpServlet
为了面试,会问:请说出Servlet体系结构?
体系结构关系
查看某一个类的体系结构,光标放到类的上面使用Ctrl+Alt+U
Servlet接口都有什么方法
GenericServlet 类
实现了Servlet接口,重写很多方法
HttpServlet类
HttpServlet类继承GenericServlet接口,重写service方法,判断是什么请求类型,如果是get请求走子类的doGet方法,如果是post请求,都子类doPost方法。
疑问:直接继承GenericServlet 类能实现处理请求与响应吗?
可以的
新建类继承GenericServlet (了解)
package com.itheima.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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 = "Demo3Servlet", urlPatterns = "/Demo3Servlet")
public class Demo3Servlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello Demo3Servlet");
}
}
重新部署
部署完成的标识
访问
小结
servlet体系结构包含3个类
Servlet接口
GenericServlet子类
HttpServlet子子类(推荐继承这个类实现自定义Servlet)
以后创建servlet建议使用什么方式?
httpServlet
14.Servlet映射路径1—配置多个路径【应用】
思考
一个servlet可以通过多个不同路径访问吗?
可以,给servlet配置多个路径
目标
掌握servlet配置映射路径的精确匹配与模糊匹配的
映射路径匹配方式
-
精确匹配
上面讲的都是属于精确匹配,配置的url与用户访问的url要一模一样才可以访问到对应的servlet.
-
模糊匹配
模糊匹配使用一个通配符“*”号,只有这一个通配符。 通配符匹配使用只有2种方式: 1.前缀匹配,必须以“/”开头,以“*”结尾(*前面必须有/) 例子,/abc/*,只要用户访问时/abc/开头都可以匹配到 2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用 例子,*.do,只要用户访问时以.do结尾都可以匹配到
注意:
/abc/*/abc
既不属于前缀也不属于后缀,属于精确匹配
注解方式实现
package _02servlet配置映射路径;
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;
/*
* 模糊匹配使用一个通配符“*”号,代表0到多个任意字符,只有这一个通配符。
通配符匹配使用只有2种方式:
1.前缀匹配,必须以“/”开头,以“/*”结尾
例子,/abc/*,只要用户访问时/abc/开头都可以匹配到
2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用
例子,*.do,只要用户访问时以.do结尾都可以匹配到
urlPatterns属性设置有2种方式
设置一个url:urlPatterns = "/UrlPatternServlet"
设置多个url:urlPatterns = {"/UrlPatternServlet","xxx","xxx",...}
*/
@WebServlet(name = "UrlPatternServlet", urlPatterns = {
//精确匹配
"/UrlPatternServlet","/123/*/123",
//模糊匹配-前缀匹配
"/abc/*",
//模糊匹配-后缀匹配
"*.do"
})
public class UrlPatternServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello UrlPatternServlet");
}
}
xml配置文件方式实现【了解】
-
可以配置多个url-pattern
<servlet-mapping> <servlet-name>Demo1Servlet</servlet-name> <url-pattern>/demo1</url-pattern> <!-- 可以配置多个url-pattern --> <url-pattern>/hello</url-pattern> <url-pattern>/hello.html</url-pattern> </servlet-mapping>
-
可以配置多个servlet-mapping
<servlet-mapping> <servlet-name>Demo1Servlet</servlet-name> <url-pattern>/demo1</url-pattern> <!-- 可以配置多个url-pattern --> <url-pattern>/hello</url-pattern> <url-pattern>/hello.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo1Servlet</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping>
注意如下
1. 匹配模式一样的时候,匹配相似度越高优先级越高
2. 精确匹配优先于模糊匹配
3. 都为模糊匹配时,前缀匹配优先级高于后缀匹配
小结
-
什么是精确匹配?
访问的url与配置的url一模一样才可以访问
-
什么是模糊匹配?
使用了通配符“*” ,只有2种用法,前缀和后缀
-
映射路径优先级?
精确>模糊 前缀>后缀
相似度高>相似度低
### 15.Servlet映射路径2—缺省路径【了解】
##### 思考
* servlet映射路径配置为`“/”和“/*”`,会处理什么路径资源的请求?
可以匹配任何资源路径的访问,这个路径会导致静态资源无法访问
##### 目标
掌握servlet的缺省路径的含义
##### 缺省路径介绍
`“/”和“/*”`就是缺省路径,缺省路径可以匹配一切资源。该映射路径已经被全局tomcat/conf/web.xml使用了,其中DefaultServlet配置了缺省路径。DefaultServlet是用于处理静态资源响应的。
##### 静态资源访问流程
![\[外链图片转存失败(img-0aD7ni1J-1565864875067)(assets/)\]](https://img-blog.csdnimg.cn/20190815185750753.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0J1bGlkX0V2b2x0bw==,size_16,color_FFFFFF,t_70)
<font color=red>注意:“/”和“/*”是一样的效果,可以匹配所有资源,建议开发者不要使用这个配置url-pattern,如果开发人员使用了这个配置,就覆盖了缺省路径,就会导致所有的静态资源无法访问了</font>
##### 小结
* 访问静态资源走的是哪个servlet处理请求?
DefaultServlet
* 在给servlet配置映射路径注意什么?
不能使用缺省路径
### 16.Servlet生命周期【理解】
##### 目标
通过生命周期学习servlet是谁创建的,什么时候创建的,什么时候释放内存销毁
##### 生命周期
就是一个对象从创建到销毁的过程
##### 实现步骤
1. 创建一个servlet
2. 重写init,service,destory方法
3. 测试运行
```java
package _03servlet的生命周期;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* 面试题:
* 1.请说出servlet生命周期相关方法
* init方法
* service方法
* destroy方法
* 2.servlet对象什么时候创建的?
* 默认第一次调用时候创建,服务器创建的
* 3.servlet对象创建了几次?
* 只创建一次,全局唯一,单例模式对象,节省内存
* 4.servlet默认是在第一次访问时创建,能修改为启动时创建?
* 可以的,设置loadOnStartup的值为1~6的一个值代表服务器启动时创建
* 值越小代表越先创建
* */
@WebServlet(name = "LifeCycleServlet", urlPatterns = "/LifeCycleServlet",loadOnStartup =1 )
public class LifeCycleServlet extends HttpServlet {
//init初始化方法,servlet对象创建的时候调用,只被调用一次
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("==调用了LifeCycleServlet的init方法==");
}
//sevice处理请求与响应方法,每次请求都会调用
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("==调用了LifeCycleServlet的service方法==");
}
//destroy销毁方法,服务器关闭的时候调用
@Override
public void destroy() {
super.destroy();
System.out.println("==调用了LifeCycleServlet的destroy方法==");
}
}
xml方式配置启动时创建
运行效果
小结
servlet是由服务器创建的
在用户第一次访问servlet的时候服务器创建的servlet对象,只创建了一次,全局唯一
17.ServletConfig配置参数【了解】
目标
掌握使用ServletConfig读取当前servlet配置的参数数据
介绍
它是servlet的一个配置文件对象
作用
可以读取web.xml中或注解对当前servlet配置的参数数据
api方法
案例
配置2个参数数据,之后使用sevletConfig获取参数数据值
实现步骤
- 配置参数数据
- 使用ServletConfig对象的api获取配置参数数据值
实现代码
注解方式实现【了解】
@WebServlet(name = "UserServlet", urlPatterns = "/UserServlet",
initParams = {
@WebInitParam(name = "参数名1",value = "参数值1"),
@WebInitParam(name = "参数名2",value = "参数值1"),
}
)
xml配置文件方式实现【重点】
<!--配置ServletConfigServlet的参数数据-->
<servlet>
<servlet-name>ServletConfigServlet</servlet-name>
<servlet-class>_04ServletConfig读取配置参数数据.ServletConfigServlet</servlet-class>
<!--配置参数数据-->
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>20</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfigServlet</servlet-name>
<url-pattern>/ServletConfigServlet</url-pattern>
</servlet-mapping>
读取数代码
package _04ServletConfig读取配置参数数据;
import javax.servlet.ServletConfig;
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;
import java.util.Enumeration;
public class ServletConfigServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//1.获取参数名称列表,Enumeration是一个古老的迭代器
Enumeration<String> enumeration = config.getInitParameterNames();
//2.遍历列表,循环读取每一个参数数据
while(enumeration.hasMoreElements()){
//获取当前元素为参数名字
String paramName = enumeration.nextElement();
//根据参数名字获取参数值
String paramValue = config.getInitParameter(paramName);
System.out.println(paramName+"="+paramValue);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
效果
访问地址:http://localhost:8080/day24_04_servlet3_0_war_exploded/ServletConfigServlet
18.Servlet运行原理【理解】
目标
知道servlet怎么的创建的,request和response怎么来的
运行原理(时序图)
小结
服务器根据url找到类全名,通过反射Class.forName(servlet类全名)创建了servlet对象,服务器将所有请求数据封装到request对象中,所有响应数据封装到response中,将request和response传入service方法,是使用反射调用service方法。
19.案例-显示用户列表
目标
访问服务器显示所有的用户信息
效果
需求
-
通过Servlet+数据数据库操作
-
数据库使用mybatis
-
表中的数据如下
准备数据
create table userinfo ( id int primary key auto_increment, username varchar(20) not null, birthday date, sex char(1) default '男', address varchar(50) ); insert into userinfo values (null, '孙悟空','1980-10-24','男','花果山水帘洞'); insert into userinfo values (null, '白骨精','1992-11-12','女','白虎岭白骨洞'); insert into userinfo values (null, '猪八戒','1983-05-20','男','福临山云栈洞'); insert into userinfo values (null, '蜘蛛精','1995-03-22','女','盤丝洞'); select * from userinfo;
sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--加载jdbc连接配置--> <properties resource="jdbc.properties"></properties> <!--定义实体类别名--> <typeAliases> <package name="com.itheima.entity"/> </typeAliases> <environments default="mysql"> <!--配置连接指定的数据库服务器环境信息--> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="pooled"> <!--配置驱动类--> <property name="driver" value="${driver}"/> <!--url--> <property name="url" value="${url}"/> <!--数据库的用户名--> <property name="username" value="${username}"/> <!--数据库的密码--> <property name="password" value="${password}"/> <!--最大连接数,poolMaximumActiveConnections可以不用配置,默认是10,需要改动就要设置--> <property name="poolMaximumActiveConnections" value="${poolMaximumActiveConnections}"/> </dataSource> </environment> </environments> <!--加载其它映射文件--> <mappers> <package name="com.itheima.dao"/> </mappers> </configuration>
项目结构
注:lib必须放在WEB-INF/lib目录下,否则所有的jar包不会部署到web服务器中。
实现代码
User实体类代码
package com.itheima.entity;
public class User {
private int id;
private String username;
private String birthday;
private String sex;
private String address;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday='" + birthday + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
public User() {
}
public User(int id, String username, String birthday, String sex, String address) {
this.id = id;
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
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 getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
UserListServlet
package com.itheima.servlet;
import com.itheima.dao.IUserDao;
import com.itheima.entity.User;
import com.itheima.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
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;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(name = "UserListServlet", urlPatterns = "/UserListServlet")
public class UserListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.初始化SqlSession资源
SqlSession sqlSession = MybatisUtils.getSession();
//2.获取Dao代理对象
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//3.获取用户列表
List<User> userList = userDao.findAll();
//4.打印输出
//解决response输出中文乱码
response.setContentType("text/html;charset=utf8");
//获取输出流
PrintWriter out = response.getWriter();
out.write("<table border='1'>");
out.write("<tr>");
out.write("<th>编号</th>");
out.write("<th>姓名</th>");
out.write("<th>生日</th>");
out.write("<th>性别</th>");
out.write("<th>地址</th>");
out.write("</tr>");
//循环用户列表遍历打印
for (User user : userList) {
out.write("<tr>");
out.write("<td>"+user.getId()+"</td>");
out.write("<td>"+user.getUsername()+"</td>");
out.write("<td>"+user.getBirthday()+"</td>");
out.write("<td>"+user.getSex()+"</td>");
out.write("<td>"+user.getAddress()+"</td>");
out.write("</tr>");
}
out.write("</table>");
//5.释放连接资源
MybatisUtils.closeSession(sqlSession);
}
}
@WebServlet(name = “UserListServlet”, urlPatterns = “/UserListServlet”)
public class UserListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.初始化SqlSession资源
SqlSession sqlSession = MybatisUtils.getSession();
//2.获取Dao代理对象
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//3.获取用户列表
List<User> userList = userDao.findAll();
//4.打印输出
//解决response输出中文乱码
response.setContentType("text/html;charset=utf8");
//获取输出流
PrintWriter out = response.getWriter();
out.write("<table border='1'>");
out.write("<tr>");
out.write("<th>编号</th>");
out.write("<th>姓名</th>");
out.write("<th>生日</th>");
out.write("<th>性别</th>");
out.write("<th>地址</th>");
out.write("</tr>");
//循环用户列表遍历打印
for (User user : userList) {
out.write("<tr>");
out.write("<td>"+user.getId()+"</td>");
out.write("<td>"+user.getUsername()+"</td>");
out.write("<td>"+user.getBirthday()+"</td>");
out.write("<td>"+user.getSex()+"</td>");
out.write("<td>"+user.getAddress()+"</td>");
out.write("</tr>");
}
out.write("</table>");
//5.释放连接资源
MybatisUtils.closeSession(sqlSession);
}
}