文章目录
Servlet 程序开发
一、Servlet概念及工作原理
什么是Servlet?
Servlet功能:
Servlet运行需要Servlet容器:
Servlet 工作流程:
Servlet生命周期:
Servlet使用单例模式,服务器重启之后Servlet才被销毁
二、Servlet开发过程
调用Servlet的两种方法:
- 第一种方法:
- 第二种方法:
开发时如何应用:
三、Servlet 主要接口和类
1. Servlet接口
init 方法:
service方法:
destroy方法:
getServletConfig方法:
getServletInfo方法:
2.ServletRequest接口
常用(?)接口:
3.ServletResponse接口
常用接口:
4.GenericServlet抽象类
5.HttpServlet抽象类
HttpServlet抽象类的主要方法:
6. HttpServletRequest和HttpServletResponse接口
HttpServletRequest接口常用方法:
HttpServletResponse接口常用方法:
上述接口和抽象类之间的关系:
7.ServletContext和ServletConfig接口
- ServletContext接口:
每个Web应用有唯一的ServletContext,但是一个ServletContext可以对应多个Servlet。
ServletContext接口提供的方法:
- ServletConfig接口:
8.HttpSession接口和Cookie类
- HttpSession接口
- Cookie类
9.RequestDispatcher接口
Web应用中需要注意路径:
转发与其他三种情况不同,只能在同一个应用中转发。
四、Servlet共享变量
三种方法的作用域:
三种方法的实现:
setAttribute:
getAttribute()
使用中需要注意因为页面跳转,重启服务器等造成的共享变量失效的情况;
例:
//这是ShareSharingVars这个Servlet的dopost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 1
ServletContext sc = this.getServletContext();
sc.setAttribute("sharingvar_sc", "context");
// 2
HttpSession session = request.getSession();
session.setAttribute("sharingvar_se", "session");
// 3
request.setAttribute("sharingvar_req", "request");
String sc_value = (String) sc.getAttribute("sharingvar_sc");
String session_value = (String) session.getAttribute("sharingvar_se");
String request_value = (String) request.getAttribute("sharingvar_req");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><meta charset=\"UTF-8\"><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("ShareSharingVars输出页面<br>");
out.println("在同一个页面中读取共享变量<br>");
out.println("Context:" + sc_value + "<br>");
out.println("Session:" + session_value + "<br>");
out.println("Request:" + request_value + "<br>");
out.println(" <a href=/ServletTrain_war_exploded/GetSharingVars>");//此处直接使用超链接
out.println(" 使用超链接跳转到使用共享变量页面");
out.println(" </a>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
运行ShareSharingVars这个Servlet:
Context、Session、Request的值都是正确的。
点击超链接:
Context、Session值显示正确,但是Request是null。因为用超链接跳转,访问时创建了新的HttpRequest,而ServletContext和HttpSession的作用域更广,通过超链接跳转到其他页面,获得的仍然是同一个ServletContext实例和HttpSession实例。
有一种方法能避免这种情况:
那就是getRequestDispatcher().forward()
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 1
ServletContext sc = this.getServletContext();
sc.setAttribute("sharingvar_sc", "context");
// 2
HttpSession session = request.getSession();
session.setAttribute("sharingvar_se", "session");
// 3
request.setAttribute("sharingvar_req", "request");
// 4
request.getRequestDispatcher("/GetSharingVars").forward(request, response);//将request和response实例发给GetSharingVars这个Servlet处理。
}
运行该Servlet,结果如下:
五、Servlet文件操作
读写文件
注意上图服务器文件,Servlet是运行在服务器上的,所以只能读写服务器上的文件。
读文件示例代码
//仅仅展示读文件Servlet类中的dopost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置页面的文档类型和字符集,页面中的字符所采用的字符集
response.setContentType("text/html;charset=UTF-8");
//设置页面的编码方式,即以什么样的编码方式来保存页面文件
response.setCharacterEncoding("UTF-8");
//从response中获得PrintWriter类的对象,以用于向页面输出信息
PrintWriter out = response.getWriter();
//向页面输出信息
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><meta charset=\"UTF-8\"><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(" <XMP>");
String fileName = "/WEB-INF/web.xml";文件相对路径
String filePath = this.getServletContext().getRealPath(fileName);//文件绝对路径
out.println("要读取的文件:" + filePath);
out.println("内容如下:");
//使用文件的绝对路经打开文件
File file = new File(filePath);
if(file.exists())
{
//使用打开的文件对象,创建FileReader类的实例
FileReader reader = new FileReader (file);
//使用打开文件对应的reader对象,创建BufferedReader 类的实例
BufferedReader bufferReader = new BufferedReader (reader);
String line = null;
//逐行读取文件,并输出到页面上
while((line = bufferReader.readLine())!=null)
{
out.println(line);
}
bufferReader.close();
}else
{
out.print("未找到文件!");
}
out.println(" </XMP>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
上述示例中比较关键的代码片段:
由Servlet服务器中文件的相对路径
获得文件的绝对路径
:
String fileName = "/WEB-INF/web.xml";文件相对路径
String filePath = this.getServletContext().getRealPath(fileName);//文件绝对路径
使用绝对路径读取文件(和普通的文件读写一致):
File file = new File(filePath);
if(file.exists())
{
//使用打开的文件对象,创建FileReader类的实例
FileReader reader = new FileReader (file);
//使用打开文件对应的reader对象,创建BufferedReader 类的实例
BufferedReader bufferReader = new BufferedReader (reader);
String line = null;
//逐行读取文件,并输出到页面上
while((line = bufferReader.readLine())!=null)
{
out.println(line);
}
bufferReader.close();
}else
{
out.print("未找到文件!");
}
写文件示例代码
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置页面的文档类型和字符集,页面中的字符所采用的字符集
response.setContentType("text/html;charset=UTF-8");
//设置页面的编码方式,即以什么样的编码方式来保存页面文件
response.setCharacterEncoding("UTF-8");
//从response中获得PrintWriter类的对象,以用于向页面输出信息
PrintWriter out = response.getWriter();
String fileName = "temp.txt";//文件相对路径
String filePath = this.getServletContext().getRealPath(fileName);//文件绝对路径
//使用文件的绝对路经打开文件,如果文件不存在则创建文件
File file = new File(filePath);
//使用打开的文件对象,创建FileWriter类的实例
FileWriter writer = new FileWriter(file);
//使用打开文件对应的writer对象,创建BufferedWriter类的实例
BufferedWriter bufferWriter = new BufferedWriter(writer);
//通过BufferedReader 类的实例,向文件中写入信息
bufferWriter.write("J2EE课程");
bufferWriter.newLine();
bufferWriter.write("Servlet写文件");
//刷新缓存,将缓存中的内容写入到文件中
bufferWriter.flush();
bufferWriter.close();
writer.close();
out.print("<font size='2'>文件写入完毕,路径:"+file.getAbsolutePath()+"</font>");
}
上传文件
MultipartConfig标注
HttpServletRequest为上传文件提供了两个新方法:
注意Servlet上传文件时,文件是对象不再是File
类型,而是Part
类型。
下载文件
六、Servlet访问数据库
七、Servlet过滤器与监听器
过滤器:
过滤器链:
过滤器的执行过程:
实现过滤器:
示例:
如何配置web.xml
监听器: