Servlet(一)
1 如何开发一个Servlet
1.1 步骤:
1)编写java类,继承HttpServlet类
2)重新doGet和doPost方法
3)Servlet程序交给tomcat服务器运行!!
3.1 servlet程序的class码拷贝到WEB-INF/classes目录
3.2 在web.xml文件中进行配置(@webServlet("/GetAction")自动进行信息配置)
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.ServletInputStream; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 13 @WebServlet("/GetAction") 14 public class GetAction extends HttpServlet { 15 private static final long serialVersionUID =1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 /** 19 get方法特点 20 1、地址栏URL上面以明文的方式附带参数 21 url?参数=参数值&参数=参数值 22 2、get参数有大小限制,不超过2kb 23 3、get方式只适合不太敏感的数据 24 4、浏览器默认都是get方法 25 */ 26 // String str=request.getQueryString(); 27 // System.out.print(str); 28 //-->name=123&pwd=abc 29 //将上述信息进行切割 -->123 abc 30 String name=request.getParameter("name"); 31 String pwd=request.getParameter("pwd"); 32 System.out.print(name+" "+pwd); 33 } 34 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 35 /** 36 post() 37 */ 38 ServletInputStream in=request.getInputStream(); 39 byte[] b=new byte[1024]; 40 while(in.read(b)!=-1) { 41 System.out.print(new String(b)); 42 } 43 in.close(); 44 } 45 46 }
原执行结果:name=123&pwd=abc
利用自带切割字符串方法执行结果:123 abc
2、Servlet的映射路径
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
url-pattern 浏览器输入
精确匹配 /first http://localhost:8080/day10/first
/itcast/demo1
http://localhost:8080/day10/itcast/demo1
模糊匹配 /* http://localhost:8080/day10/任意路径
/工程/* http://localhost:8080/工程/任意路径
*.后缀名 http://localhost:8080/day10/任意路径.do
*.do
*.action
*.html(伪静态)
注意:
1)url-pattern要么以 / 开头,要么以*开头。 例如, itcast是非法路径。
2)不能同时使用两种模糊匹配,例如 /itcast/*.do是非法路径
3)当有输入的URL有多个servlet同时被匹配的情况下:
3.1 精确匹配优先。(长的最像优先被匹配)
3.2 以后缀名结尾的模糊url-pattern优先级最低!!!
3 servlet缺省路径
servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。
该路径对应的是一个DefaultServlet(缺省Servlet)。
这个缺省的Servlet的作用是用于解析web应用的静态资源文件。
问题: URL输入http://localhost:8080/day10/index.html 如何读取文件????
1)到当前day10应用下的web.xml文件查找是否有匹配的url-pattern。
2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
3)DefaultServlet程序到day10应用的根目录下查找是存在一个名称为index.html的静态文件。
4)如果找到该文件,则读取该文件内容,返回给浏览器。
5)如果找不到该文件,则返回404错误页面。
结论: 先找动态资源,再找静态资源。
servlet通讯
request
session
例如:
1 package com.uplooking.action; 2 3 import java.io.IOException; 4 import java.util.Date; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class HelloServlet extends HttpServlet { 12 13 @Override 14 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15 resp.setCharacterEncoding("utf-8"); 16 resp.getWriter().write("你好"+new Date()); 17 } 18 19 }
进行web.xml信息配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>0123</display-name> 4 5 <servlet> 6 <servlet-name>HelloServlet</servlet-name> 7 <servlet-class>com.uplooking.action.HelloServlet</servlet-class> 8 </servlet> 9 10 <servlet-mapping> 11 <servlet-name>HelloServlet</servlet-name> 12 <url-pattern>/HelloServlet</url-pattern> 13 </servlet-mapping> 14 15 <welcome-file-list> 16 <welcome-file>index.html</welcome-file> 17 <welcome-file>index.htm</welcome-file> 18 <welcome-file>index.jsp</welcome-file> 19 <welcome-file>default.html</welcome-file> 20 <welcome-file>default.htm</welcome-file> 21 <welcome-file>default.jsp</welcome-file> 22 </welcome-file-list> 23 24 </web-app>
浏览器URL输入http://localhost:8080/包名/类名
执行结果:你好
二、Servlet Request请求头
Accept: text/html,image/* -- 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 -- 浏览器接受的编码格式
Accept-Encoding: gzip,compress --浏览器接受的数据压缩格式
Accept-Language: en-us,zh- --浏览器接受的语言
Host: www.qq.com:80 --(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器最后的缓存时间
Referer: http://www.qq.com/index.jsp -- 当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器类型
Cookie:name=eric -- 浏览器保存的cookie信息
Connection: close/Keep-Alive -- 浏览器跟服务器连接状态。close: 连接关闭 keep-alive:保存连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 请求发出的时间
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 12 @WebServlet("/RequestAction") //自动配置web.xml文件 13 public class RequestAction extends HttpServlet { 14 private static final long serialVersionUID =1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 String str=request.getHeader("User-Agent"); 18 System.out.print(str); 19 if(str.contains("Firefox")){ 20 System.out.println("火狐浏览器"); 21 }else if(str.contains("Chrome")) { 22 System.out.println("谷歌浏览器"); 23 }else { 24 System.out.println("其他浏览器"); 25 } 26 } 27 }
index.jsp文件
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <form action="RequestAction" method="get"> 11 账号:<input type="text" name="name"><br> 12 密码:<input type="text" name="pwd"><br> 13 <input type="submit" value="提交"> 14 </form> 15 </body> 16 </html>
在火狐浏览器URL输入:http://localhost:8080/20180910/,并且输入账号和密码,点击提交按钮
提交账号和密码后,
STS中执行结果:火狐浏览器
request请求Referer
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 12 @WebServlet("/RequestAction") 13 public class RequestAction extends HttpServlet { 14 private static final long serialVersionUID =1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 //获取请求头信息 18 String str=request.getHeader("Referer"); 19 System.out.print(str); 20 //http://localhost:8080/20180910/ 21 //设置响应头的字符类型 22 response.setContentType("text/html;charset=utf-8") 23 //判断请求头的进入地址 24 if(str==null||str.contains("20180910")){ 25 //响应用户 26 response.getWriter().write("此链接非法,拒绝接入"+"<a href='/20180910/index.jsp'>首页</a>"); 27 } 28 } 29 }
从浏览器键入URL:http://localhost:8080/20180910/
提交后:
点击首页,进入index.jsp
STS控制台输出:
http编码常用状态
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。
500-599 用于支持服务器错误。
Http协议:
1)http协议: 对浏览器客户端和服务器端之间数据传输的格式规范。
2)http请求:浏览器->服务器端
格式:
请求行(请求方式(GET/POST) 请求资源(URI) http协议版本(http1.1))
请求头(键值对形式存在。 host、user-agent、referer)
一个空行
实体内容(POST提交的参数)
HttpServletRequest对象: 请求对象。获取请求信息。
请求行:request.getMethod() request.getRequestURI/getRequestURL() request.getProtocol();
请求头: request.getHeader("name") request.getHeaderNames()
实体内容: request.getInputStream()
获取参数数据:(GET或POST)
request.getParameter("name") 一个值的参数
request.getParameterValues("name"); 多个值的参数
request.getParameterNames() 所有参数
3)http响应: 服务器->浏览器端
格式:
响应行(http协议版本 状态码 描述)
常用的状态码: 200 302 404 500
响应头( location(结合302状态码完成请求重定向功能)、 refresh(定时刷新)、content-type、 content-disiposition(以下载方式打开))
一个空行
实体内容
HttpServletResponse对象: 响应对象。设置响应信息。
响应行: response.setStatus();
响应头: response.setHeader("name","value")
实体内容:
(PrintWriter) response.getWriter().writer(); 字符内容
(OutputStream)response.getOutputStream().writer(); 字节内容
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 12 @WebServlet("/ResponseAction") 13 public class ResponseAction extends HttpServlet { 14 private static final long serialVersionUID =1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 //自定义响应行状态 18 response.setStatus(404); 19 20 //发送404状态码和报错页面信息 21 response.sendError(404,"页面飞了"); 22 } 23 }
从浏览器键入URL:http://localhost:8080/20180910/ResponseAction
---恢复内容结束---
1 如何开发一个Servlet
1.1 步骤:
1)编写java类,继承HttpServlet类
2)重新doGet和doPost方法
3)Servlet程序交给tomcat服务器运行!!
3.1 servlet程序的class码拷贝到WEB-INF/classes目录
3.2 在web.xml文件中进行配置(@webServlet("/GetAction")自动进行信息配置)
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.ServletInputStream; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 13 @WebServlet("/GetAction") 14 public class GetAction extends HttpServlet { 15 private static final long serialVersionUID =1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 /** 19 get方法特点 20 1、地址栏URL上面以明文的方式附带参数 21 url?参数=参数值&参数=参数值 22 2、get参数有大小限制,不超过2kb 23 3、get方式只适合不太敏感的数据 24 4、浏览器默认都是get方法 25 */ 26 // String str=request.getQueryString(); 27 // System.out.print(str); 28 //-->name=123&pwd=abc 29 //将上述信息进行切割 -->123 abc 30 String name=request.getParameter("name"); 31 String pwd=request.getParameter("pwd"); 32 System.out.print(name+" "+pwd); 33 } 34 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 35 /** 36 post() 37 */ 38 ServletInputStream in=request.getInputStream(); 39 byte[] b=new byte[1024]; 40 while(in.read(b)!=-1) { 41 System.out.print(new String(b)); 42 } 43 in.close(); 44 } 45 46 }
原执行结果:name=123&pwd=abc
利用自带切割字符串方法执行结果:123 abc
2、Servlet的映射路径
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
url-pattern 浏览器输入
精确匹配 /first http://localhost:8080/day10/first
/itcast/demo1
http://localhost:8080/day10/itcast/demo1
模糊匹配 /* http://localhost:8080/day10/任意路径
/工程/* http://localhost:8080/工程/任意路径
*.后缀名 http://localhost:8080/day10/任意路径.do
*.do
*.action
*.html(伪静态)
注意:
1)url-pattern要么以 / 开头,要么以*开头。 例如, itcast是非法路径。
2)不能同时使用两种模糊匹配,例如 /itcast/*.do是非法路径
3)当有输入的URL有多个servlet同时被匹配的情况下:
3.1 精确匹配优先。(长的最像优先被匹配)
3.2 以后缀名结尾的模糊url-pattern优先级最低!!!
3 servlet缺省路径
servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。
该路径对应的是一个DefaultServlet(缺省Servlet)。
这个缺省的Servlet的作用是用于解析web应用的静态资源文件。
问题: URL输入http://localhost:8080/day10/index.html 如何读取文件????
1)到当前day10应用下的web.xml文件查找是否有匹配的url-pattern。
2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
3)DefaultServlet程序到day10应用的根目录下查找是存在一个名称为index.html的静态文件。
4)如果找到该文件,则读取该文件内容,返回给浏览器。
5)如果找不到该文件,则返回404错误页面。
结论: 先找动态资源,再找静态资源。
servlet通讯
request
session
4、Servlet的自动加载
默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
改变servlet创建对象的时机: 提前到加载web应用的时候!!!
在servlet的配置信息中,加上一个<load-on-startup>即可!!
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>类路径</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>
例如:
1 package com.uplooking.action; 2 3 import java.io.IOException; 4 import java.util.Date; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class HelloServlet extends HttpServlet { 12 13 @Override 14 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15 resp.setCharacterEncoding("utf-8"); 16 resp.getWriter().write("你好"+new Date()); 17 } 18 19 }
进行web.xml信息配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>0123</display-name> 4 5 <servlet> 6 <servlet-name>HelloServlet</servlet-name> 7 <servlet-class>com.uplooking.action.HelloServlet</servlet-class> 8 </servlet> 9 10 <servlet-mapping> 11 <servlet-name>HelloServlet</servlet-name> 12 <url-pattern>/HelloServlet</url-pattern> 13 </servlet-mapping> 14 15 <welcome-file-list> 16 <welcome-file>index.html</welcome-file> 17 <welcome-file>index.htm</welcome-file> 18 <welcome-file>index.jsp</welcome-file> 19 <welcome-file>default.html</welcome-file> 20 <welcome-file>default.htm</welcome-file> 21 <welcome-file>default.jsp</welcome-file> 22 </welcome-file-list> 23 24 </web-app>
浏览器URL输入http://localhost:8080/包名/类名
执行结果:你好
二、Servlet Request请求头
Accept: text/html,image/* -- 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 -- 浏览器接受的编码格式
Accept-Encoding: gzip,compress --浏览器接受的数据压缩格式
Accept-Language: en-us,zh- --浏览器接受的语言
Host: www.qq.com:80 --(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --浏览器最后的缓存时间
Referer: http://www.qq.com/index.jsp -- 当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --浏览器类型
Cookie:name=eric -- 浏览器保存的cookie信息
Connection: close/Keep-Alive -- 浏览器跟服务器连接状态。close: 连接关闭 keep-alive:保存连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 请求发出的时间
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 12 @WebServlet("/RequestAction") //自动配置web.xml文件 13 public class RequestAction extends HttpServlet { 14 private static final long serialVersionUID =1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 String str=request.getHeader("User-Agent"); 18 System.out.print(str); 19 if(str.contains("Firefox")){ 20 System.out.println("火狐浏览器"); 21 }else if(str.contains("Chrome")) { 22 System.out.println("谷歌浏览器"); 23 }else { 24 System.out.println("其他浏览器"); 25 } 26 } 27 }
index.jsp文件
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <form action="RequestAction" method="get"> 11 账号:<input type="text" name="name"><br> 12 密码:<input type="text" name="pwd"><br> 13 <input type="submit" value="提交"> 14 </form> 15 </body> 16 </html>
在火狐浏览器URL输入:http://localhost:8080/20180910/,并且输入账号和密码,点击提交按钮
提交账号和密码后,
STS中执行结果:火狐浏览器
request请求Referer
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 12 @WebServlet("/RequestAction") 13 public class RequestAction extends HttpServlet { 14 private static final long serialVersionUID =1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 //获取请求头信息 18 String str=request.getHeader("Referer"); 19 System.out.print(str); 20 //http://localhost:8080/20180910/ 21 //设置响应头的字符类型 22 response.setContentType("text/html;charset=utf-8") 23 //判断请求头的进入地址 24 if(str==null||str.contains("20180910")){ 25 //响应用户 26 response.getWriter().write("此链接非法,拒绝接入"+"<a href='/20180910/index.jsp'>首页</a>"); 27 } 28 } 29 }
从浏览器键入URL:http://localhost:8080/20180910/
提交后:
点击首页,进入index.jsp
STS控制台输出:
http编码常用状态
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。
500-599 用于支持服务器错误。
Http协议:
1)http协议: 对浏览器客户端和服务器端之间数据传输的格式规范。
2)http请求:浏览器->服务器端
格式:
请求行(请求方式(GET/POST) 请求资源(URI) http协议版本(http1.1))
请求头(键值对形式存在。 host、user-agent、referer)
一个空行
实体内容(POST提交的参数)
HttpServletRequest对象: 请求对象。获取请求信息。
请求行:request.getMethod() request.getRequestURI/getRequestURL() request.getProtocol();
请求头: request.getHeader("name") request.getHeaderNames()
实体内容: request.getInputStream()
获取参数数据:(GET或POST)
request.getParameter("name") 一个值的参数
request.getParameterValues("name"); 多个值的参数
request.getParameterNames() 所有参数
3)http响应: 服务器->浏览器端
格式:
响应行(http协议版本 状态码 描述)
常用的状态码: 200 302 404 500
响应头( location(结合302状态码完成请求重定向功能)、 refresh(定时刷新)、content-type、 content-disiposition(以下载方式打开))
一个空行
实体内容
HttpServletResponse对象: 响应对象。设置响应信息。
响应行: response.setStatus();
响应头: response.setHeader("name","value")
实体内容:
(PrintWriter) response.getWriter().writer(); 字符内容
(OutputStream)response.getOutputStream().writer(); 字节内容
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 12 @WebServlet("/ResponseAction") 13 public class ResponseAction extends HttpServlet { 14 private static final long serialVersionUID =1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 //自定义响应行状态 18 response.setStatus(404); 19 20 //发送404状态码和报错页面信息 21 response.sendError(404,"页面飞了"); 22 } 23 }
从浏览器键入URL:http://localhost:8080/20180910/ResponseAction
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 13 @WebServlet("/ResponseAction") 14 public class ResponseAction extends HttpServlet { 15 private static final long serialVersionUID =1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 //自定义响应行状态 19 //response.setStatus(404); 20 21 //发送404状态码和报错页面信息 22 //response.sendError(404,"页面飞了"); 23 24 //设置响应头 25 response.setHeader("name","abc"); 26 27 //响应内容 28 PrintWriter writer=response.getWriter(); 29 writer.write("Hello"); 30 31 32 33 //定时刷新 每隔3秒刷新 跳转url 34 response.setHeader("refresh","3,url=/20180910/index.jsp"); 35 writer.close();//关闭流 36 37 } 38 }
从浏览器键入URL:http://localhost:8080/20180910/ResponseAction
跳转到index.jsp页面
读取D盘中jpeg类型的tim.jpg图像文件:
package com.uplooking.controller; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ResponseAction1") public class ResponseAction1 extends HttpServlet { private static final long serialVersionUID =1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //响应头的设置 response.setHeader("content-type","image/jpeg"); File file=new File("D://tim.jpg"); FileInputStream in=new FileInputStream(file); byte[] b=new byte[1024]; while(in.read(b)!=-1) { response.getOutputStream().write(b); } response.getOutputStream().close(); in.close(); } }
从浏览器键入URL:http://localhost:8080/20180910/ResponseAction1
执行结果:
对tim.jpg图像文件进行下载
package com.uplooking.controller; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ResponseAction1") public class ResponseAction1 extends HttpServlet { private static final long serialVersionUID =1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // //响应头的设置 // response.setHeader("content-type","image/jpeg"); //设置下载 response.setHeader("Content-Disposition","attachment;filename=tim.jpg"); File file=new File("D://tim.jpg"); FileInputStream in=new FileInputStream(file); byte[] b=new byte[1024]; while(in.read(b)!=-1) { response.getOutputStream().write(b); } response.getOutputStream().close(); in.close(); } }
从浏览器键入URL:http://localhost:8080/20180910/ResponseAction1
Sevlet的生命周期(重点)
4.1 引入
Servlet的生命周期: servlet类对象什么时候创建,什么时候调用什么方法,什么时候销毁。
以前的对象: new Student(); stu.study(); stu=null;
Servlet程序的生命周期由tomcat服务器控制的!!!!
4.2 Servlet重要的四个生命周期方法
构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 只调用1次。证明servlet对象在tomcat是单实例的。
init方法: 创建完servlet对象的时候调用。只调用1次。
service方法: 每次发出请求时调用。调用n次。
destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。
只调用1次。
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletRequest; 8 import javax.servlet.ServletResponse; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 @WebServlet("/DemoAction") 14 public class DemoAction extends HttpServlet { 15 int count=0; 16 private static final long serialVersionUID = 1L; 17 18 //1、构造方法 //线程的方式处理多个请求 19 public DemoAction() { 20 System.out.println("1、构造方法"); 21 } 22 23 //2、初始化 24 @Override 25 public void init(ServletConfig config) throws ServletException { 26 System.out.println("2、初始化"); 27 } 28 29 //3、服务 30 @Override 31 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 32 System.out.println("3、服务"); 33 } 34 //4、销毁 35 @Override 36 public void destroy() { 37 System.out.println("4、销毁"); 38 } 39 40 }
从浏览器键入URL:http://localhost:8080/20180910/DemoAction
当请求多次http://localhost:8080/20180910/DemoAction时,只会调用服务,构造方法和服务只会执行一次
当改变DemoAction.java中的内容,如:添加注释线程方式处理多个请求。进行重新配置,会销毁Servlet对象。
由于是单例模式,全局变量count 属于一个公用的存储空间。给予多线程的使用,每次使用的时候Service()方法生成一个新的线程。
1 package com.uplooking.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletConfig; 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletRequest; 8 import javax.servlet.ServletResponse; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 @WebServlet("/DemoAction") 14 public class DemoAction extends HttpServlet { 15 int count=0; 16 private static final long serialVersionUID = 1L; 17 18 //1、构造方法 //线程的方式处理多个请求 19 public DemoAction() { 20 System.out.println("1、构造方法"); 21 } 22 23 //2、初始化 24 @Override 25 public void init(ServletConfig config) throws ServletException { 26 System.out.println("2、初始化"); 27 } 28 29 // //3、服务 30 // @Override 31 // public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 32 // System.out.println("3、服务"); 33 // } 34 //4、销毁 35 @Override 36 public void destroy() { 37 System.out.println("4、销毁"); 38 } 39 40 @Override 41 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 42 //由于是单例模式,全局变量count 属于一个公用的存储空间。 43 //给予多线程的使用,每次使用的时候Service()方法生成一个新的线程 44 count++; 45 int count2=0; 46 count2++; 47 resp.getWriter().write("count="+count+" count2="+count2); 48 49 } 50 }
从浏览器键入URL:http://localhost:8080/20180910/DemoAction
执行结果:
count是全局变量,相当于上述的服务,多线程,每次执行时调用doGet方法。
Servlet的自动加载
默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
改变servlet创建对象的时机: 提前到加载web应用的时候!!!
在servlet的配置信息中,加上一个<load-on-startup>即可!!
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>类路径</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>
1 //@WebServlet("/DemoAction") 2 @WebServlet(name="DemoAction",urlPatterns="/DemoAction",loadOnStartup=1)
从浏览器键入URL:http://localhost:8080/20180910/DemoAction
执行结果:
上述注解等同于在web.xml文件写入配置信息
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 4 <servlet> 5 <servlet-name>DemoAction</servlet-name> 6 <servlet-class>com.uplooking.controller.DemoAction</servlet-class> 7 <load-on-startup>1</load-on-startup> 8 </servlet> 9 10 <servlet-mapping> 11 <servlet-name>DemoAction</servlet-name> 12 <url-pattern>/DemoAction</url-pattern> 13 </servlet-mapping> 14 15 <display-name>20180910</display-name> 16 <welcome-file-list> 17 <welcome-file>index.html</welcome-file> 18 <welcome-file>index.htm</welcome-file> 19 <welcome-file>index.jsp</welcome-file> 20 <welcome-file>default.html</welcome-file> 21 <welcome-file>default.htm</welcome-file> 22 <welcome-file>default.jsp</welcome-file> 23 </welcome-file-list> 24 </web-app>
从浏览器键入URL:http://localhost:8080/20180910/DemoAction
执行结果:
文件目录
待整理。。。