Java-servelt
作者:互联网
一、Servlet线程特性
(一)Web应用服务器将为每个客户端的连接启动一个线程来服务
(二)多个浏览器客户端访问同一个Servlet,服务器会创建多少个Servlet对象
- 第一次访问Servlet时,服务器将创建一个该Servlet类的对象,并调用doXXX方法生成响应
- 多个客户端访问同一个Servlet时,不再创建新的对象,而是共用同一个Servlet对象
- 可以说,Servlet是多线程单实例的(一个web.xml配置servlet-name 对应一个实例)
(三)课堂练习
1.目标
- 多个浏览器客户端访问同一个Servlet,服务器会创建多少个Servlet对象吗?
2.步骤
(1)创建 Web Project
(2)创建Servlet
(3)分别在构造方法、无参init方法、doGet方法、doPost方法中编写打印输出语句进行验证
(4)启动多个浏览器访问同一个servlet,最终访问的是同一个servlet实例
|
3.结论
- 结论:第一次访问Servlet时,服务器将创建一个该Servlet类的对象,并调用doXXX方法生成响应;
- 多个客户端访问同一个Servlet时,不再创建新的对象,而是共用同一个Servlet对象。
- Servlet是多线程单实例
二、请求和响应接口
(一)Web应用基于HTTP协议,HTTP协议基于请求/响应模型
1.什么是请求数据
- 通过浏览器给服务端的所有数据称为请求数据
2.什么是响应数据
- 通过服务器返回给客户端的数据称为响应数据
3.封装和操作请求数据和响应数据是请求接口和响应接口
4.doXXX
public abstract class HttpServlet
extends GenericServlet
implements java.io.Serializable
- 服务器(Tomcat)会创建请求对象和响应对象传递给doXXX方法,doXXX方法中可以直接使用请求和响应对象
- 参数:
- req - 一个 HttpServletRequest 对象,其中包含客户端对 servlet 发出的请求
- resp - 一个 HttpServletResponse 对象,其中包含 servlet 发送给客户端的响应
1、OPTIONS
- 由服务器调用(通过 service 方法)以允许 servlet 处理 OPTIONS 请求。
- 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
- 向 服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息
3、GET
- 由服务器调用(通过 service 方法)以允许 servlet 处理 GET 请求。
- 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
- 由服务器调用(通过 service 方法)以允许 servlet 处理 POST 请求。
- 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
- 由服务器调用(通过 service 方法)以允许 servlet 处理 PUT 请求。
- 向指定资源位置上传其最新内容
6、DELETE
- 由服务器调用(通过 service 方法)以允许 servlet 处理 DELETE 请求。
- 请求服务器删除Request-URL所标识的资源
7、TRACE
- 由服务器调用(通过 service 方法)以允许 servlet 处理 TRACE 请求。
- 回显服务器收到的请求,主要用于测试或诊断
课堂练习
5.目标
- 编写简单Servlet,验证服务器会创建请求和响应对象
6.步骤
- 在doXXX()方法打印请求对象和响应对象
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet()方法"); System.out.println("request:"+request); System.out.println("response:"+response); response.getWriter().append("Served at: ").append(request.getContextPath()); } request:org.apache.catalina.connector.RequestFacade@13f51bb8 response:org.apache.catalina.connector.ResponseFacade@1d32f7b6
7.结论
- 服务器实现了请求和响应接口,实现类分别是RequestFacade以及ResponseFacade;
- 每次访问Servlet,服务器都会创建请求对象和响应对象传递给doXXX方法
- doXXX方法中可以直接使用请求和响应对象
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet()方法"); System.out.println("request:"+request); System.out.println("response:"+response); //获取上下文路径 String contextPath = request.getContextPath(); System.out.println(contextPath); response.getWriter().append("Served at: ").append(request.getContextPath()); } /0428-web-servlet
三、利用Servlet对客户端不同方式请求作出动态响应
(一)客户端访问服务器端Servlet的方式有三种
-
直接从地址栏输入URL访问;
-
在网页中点击超级链接访问;
-
在网页中通过表单提交访问;
(二)课堂练习
1.目标
- 编写Servlet,返回客户端IP地址,以测试三种请求方式
2.步骤
-
编写Servlet
-
doGet():网页输出:"您好,目前调用的是doGet方法,您的IP地址是:"+ip
-
doPost():网页输出:"您好,目前调用的是doPost方法,您的IP地址是:"+ip
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置编码 resp.setContentType("text/html;charset = utf-8"); /*ServletRequest接口 String getRemoteAddr(); 返回发送请求的客户端的互联网协议(IP)地址。*/ //获取ip String ip = req.getRemoteAddr(); //输出ip resp.getWriter().println("您好,目前调用的是doGet方法,您的IP地址是:" + ip); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset = utf-8"); String ip = req.getRemoteAddr(); resp.getWriter().write("您好,目前调用的是doPost方法,您的IP地址是:" + ip); }
-
直接在浏览器地址栏输入URL访问:Get
-
在网页中点击超链接访问:Get
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="http://localhost:8080/0428-web-servlet/TestServlet">Go servlet</a> </body> </html>
-
在网页中通过表单提交
-
没有指定method的表单,默认是get方式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="http://localhost:8080/0428-web-servlet/TestServlet"> <input type="submit" value="提交"/> </form> </body> </html>
-
指定method为post的表单,提交方式为post
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="http://localhost:8080/0428-web-servlet/TestServlet" method="post"> <input type="submit" value="提交"/> </form> </body> </html>
-
3.总结
- 直接使用URL访问,是GET方式,调用doGet方法;
- 超级链接访问,是GET方式,调用doGet方法;
- 表单提交访问,取决form的method属性的值,默认是get,指定为post时,调用doPost方法;
四、Servlet中获取普通请求不同名或同名的参w数(name1=value1&name2=value2&...)的方法
(一)客户端向服务器servlet传递请求参数的方式有2种
-
1.在url?name=value&name=value
- 直接在浏览器的地址栏输入url?name=value&name=value
- 在a标签里:<a href="url?name=value&name=value">
-
2.form表单<input/>标签<select>标签等传递请求参数
(二)服务器会将请求参数封装到请求对象中
- 当客户端请求服务器端的Servlet时,请求参数都会被发送到服务器,服务器Tomcat会将请求参数封装到请求对象request中
(三)如何从请求对象中得到请求参数的值
(四)Get请求方式的中文乱码的解决
- server.xml 配置参数:URIEncoding="UTF-8" (tomcat7需要配置,tomcat9不需要配置了,默认是utf-8)
- servlet:response.setContentType("text/html;charset=UTF-8");
(五)Post请求方式的中文乱码的解决
- servlet中设置请求编码:request.setCharacterEncoding("UTF-8");
- servlet中设置响应编码:response.setContentType("text/html;charset=UTF-8");
(六)课堂练习
1.目标
- 直接在浏览器的地址栏输入url?name=value&name=value,在servlet取得请求参数的值
2.步骤
(1)写一个TestParamServlet,用于接收请求参数name,age的值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*String getParameter(String var1);
以字符串形式返回请求参数的值,或者如果参数不存在则返回null
*/
String name = request.getParameter("name");
String age = request.getParameter("age");
resp.setContentType("text/html;charset = utf-8");
//把得到的请求参数的值显示出来
PrintWriter printWriter = response.getWriter();
printWriter.print("name="+name);
printWriter.print("age="+age);
//response.getWriter().write("name="+name+"age="+age);
}
①不传参得到的null
②传参得到是参数的值
(七)课堂练习二
1.目标
- 在a标签里:<a href="url?name=value&name=value">
2.步骤
(1)c.html,添加a标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/0428-web-servlet/TestParamServlet?name=zs&age=20">name和age请求参数</a>
</body>
</html>
(2)写一个TestParamServlet,用于接收请求参数name,age的值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*String getParameter(String var1);
以字符串形式返回请求参数的值,或者如果参数不存在则返回null
*/
String name = request.getParameter("name");
String age = request.getParameter("age");
resp.setContentType("text/html;charset = utf-8");
//把得到的请求参数的值显示出来
PrintWriter printWriter = response.getWriter();
printWriter.print("name="+name);
printWriter.print("age="+age);
//response.getWriter().write("name="+name+"age="+age);
}
(八)课堂练习三
1.目标
- form表单<input/>标签<select>标签等 传递请求参数
2.步骤
(1)d.html,添加form标签 <input>标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/0428-web-servlet/TestParamServlet" method="post">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
(2)写一个TestParamServlet,用于接收请求参数name,age的值
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//post请求 Tomcat默认编码 iso-8859-1 只支持英文 ,需设置请求编码
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
String age = req.getParameter("age");
//设置响应编码
resp.setContentType("text/html;charset = utf-8");
resp.getWriter().write("name:" + name + "age:" + age);
}
(九)课堂练习四
1.目标
- form表单<input/>标签传递同名的请求参数,在Servlet获取多个值
2.步骤
(1)d.html,添加form标签 <input>标签
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/0428-web-servlet/TestParamServlet" method="post">
姓名:<input type="text" name="name"/><br/>
年龄:<input type="text" name="age"/><br/>
爱好:
<input type="checkbox" name="hobbies" value="吃"/>吃
<input type="checkbox" name="hobbies" value="喝"/>喝
<input type="checkbox" name="hobbies" value="玩"/>玩
<input type="checkbox" name="hobbies" value="乐"/>乐<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
(2)写一个TestParamServlet,用于接收请求参数name,age的值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String age = request.getParameter("age");
/*String[] getParameterValues(String var1);
返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
*/
String[] hobbies = request.getParameterValues("hobbies");
for (String string : hobbies) {
System.out.println(string);
}
response.setContentType("text/html;charset=UTF-8");
//把得到的请求参数的值显示出来
PrintWriter printWriter = response.getWriter();
printWriter.print("name="+name);
printWriter.print("age="+age);
}
五、Servlet初始化参数
(一)什么是Servlet初始化参数
- 如果Servlet需要使用一些可以配置的参数,可以在创建Servlet时进行设置称为初始化参数;
(二)特点
- 一个Servlet可以配置多个初始化参数,
- 所有的初始化参数只能在当前Servlet类中使用;
(三)设置Servlet的初始化参数
- web.xml中的servlet节点使用init-param进行设置
<servlet>
<servlet-name>TestInitParameterServlet</servlet-name>
<servlet-class>com.tjetc.TestInitParameterServlet</servlet-class>
<init-param><!--配置初始化参数 放在 servlet-name servlet-class 后面-->
<param-name>company</param-name>
<param-value>SEVENTEEN</param-value>
</init-param>
</servlet>
(四)在servlet中如何取得初始化参数的值
- 直接在servlet中调用getInitParameter(name)就能够得到初始化参数的值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String company = super.getInitParameter("company");
System.out.println(company);
resp.setContentType("text/html;charset = utf-8");
resp.getWriter().write("servlet初始化参数:"+company);
}
六、知识点6: 全局参数
(一)什么是全局参数
- 在应用下的所有的servlet都能使用的参数称之为全局参数
(二)全局参数的特点
- 在应用下的所有的servlet都能使用全局参数
(三)设置全局参数
- web.xml的<context-param>节点进行配置
<!--配置全局参数-->
<context-param>
<param-name>student-name</param-name>
<param-value>carat </param-value>
</context-param>
(四)得到全局参数
|
carat |
七、 Servlet加载启动选项
(一)什么是servlet的启动选项
- 在web.xml配置load-on-startup,代表在服务器Tomcat启动的时候就调用servlet的构造方法实例化servlet。这就是servlet的启动选项。
- 如果没有设置该选项,默认是在第一次访问servlet时调用servlet的构造方法实例化servlet。
(二)如何配置Servlet的启动选项
- 在web.xml配置load-on-startup,
- 数值代表启动的顺序,越小越先启动
- 相等,按顺序
|
八、Servlet配置中通配符*的用法
(一)什么是通配符配置
- 要访问Servlet,必须为Servlet配置<url-pattern>,可以使用通配符*进行配置,从而通配多种访问模式
- <url-pattern>可以配置多个
(二)使用方式2种
-
1.*.扩展名 : 比如 *.do、*.action
- 在web.xml中url-pattern配置
|
-
2.以 / 开头,同时以 /* 结尾,比如 /* 、/admin/*
|
九、web.xml中首页及错误页面等其他配置信息
(一)配置首页
- xml配置welcome-file-list->welcome-file
- 配置默认首页:当不指定具体访问路径时,默认访问默认首页
- 自上而下,都有就加载第一个
- 将按照顺序访问,都不存在将报404错误
- 项目的欢迎页的配置会覆盖tomcat的conf目录下xml中的欢迎页的配置
- 如果项目中没有配置欢迎页,那么就会使用tomcat的conf目录下的xml的欢迎页配置
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> |
(二)配置错误页面
当应用中出现响应错误或者异常时,可以跳转到错误页面
web.xml配置 error-page
1.错误码
<error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> |
2.异常类型
<error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/exception.html</location> </error-page> |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> 空指针异常 </body> </html> |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String s=null; int length = s.length(); System.out.println(length); response.getWriter().append("Served at: ").append(request.getContextPath()); } |
十、知识点10:Servlet中获取请求头属性的方法
十一、知识点11:重要的请求头属性(请求长度、请求MIME类型、请求referer等)
(一)重要的请求头属性
- Content-Length:获得请求长度
- Accept:浏览器能接受的MIME(它全名叫多用途互联网邮件扩展(Multipurpose Internet Mail Extensions),最初是为了将纯文本格式的电子邮件扩展到可以支持多种信息格式而定制的。后来被应用到多种协议里,包括我们常用的HTTP协议。MIME的常见形式是一个主类型加一个子类型,用斜线分隔。比如text/html、application/javascript、image/png等。在访问网页时,MIME type帮助浏览器识别一个HTTP请求返回的是什么内容的数据,应该如何打开、如何显示)类型
- Referer:来路路径,代表请求从哪个页面转过来的.
(二)课堂练习(10分钟)
1.目标
重要的请求头属性(请求长度、请求MIME类型、请求referer
2.步骤
(1)创建TestHeadServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Content-Length获得请求的长度 int length = request.getIntHeader("Content-Length"); System.out.println("请求你的长度:"+length); //Accept:获得MIME类型 String mime = request.getHeader("Accept"); System.out.println("MIME类型:"+mime); //Referer:来路路径 String referer = request.getHeader("Referer"); System.out.println("来路路径:"+referer); response.getWriter().append("Served at: ").append(request.getContextPath()); } |
(2)创建html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="/0430-web/TestHeadServlet?name=zs">访问TestHeadServlet</a> <form action="/0430-web/TestHeadServlet"> 用户名:<input type="text" name="username"/><br/> <input type="submit" value="提交"/> </form> <form action="/0430-web/TestHeadServlet" method="post"> 用户名:<input type="text" name="username"/><br/> <input type="submit" value="提交"/> </form> </body> </html> |
(3)测试
①超链接
请求的长度:-1 MIME类型:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 来路路径:http://localhost:8080/0430-web/a.html |
②form的get请求
请求你的长度:-1 MIME类型:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 来路路径:http://localhost:8080/0430-web/a.html |
③form的post请求
请求的长度:11 MIME类型:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 来路路径:http://localhost:8080/0430-web/a.html |
十二、总结
1.servlet的线程特性:多线程单实例
2.请求和响应接口
1.请求接口:HttpServletRequest-ServletRequest
2.响应接口:HttpServletResponse-ServletResponse
3.Tomcat在每次请求servlet的时候会创建
1.HttpServletRequest接口的实现类RequestFacade对象
2.HttpServletResponse接口的实现类ResponseFacade对象
3.将这两个对象作为doXxx()方法参数传进来,程序员能够直接使用这两个对象
3.访问servlet的方式:
1、直接使用URL访问,是GET方式,调用doGet方法;
2、超链接访问,是GET方式,调用doGet方法;
3、表单提交访问,取决form的method属性的值,默认是get,指定为post时,调用doPost方法;
4.如何获得请求参数
1.获得不同名的请求参数:String request.getParameter(name)
2.获得同名的请求参数:String[] request.getParameterValues(name)
5.servlet获取初始化参数的方法
super.getInitParameter(name)
6.servlet获取全局参数的方法
getServletContext().getInitParameter(name)
7.加载启动项
<load-on-startup>1</load-on-startup>
8.Servlet配置中通配符*的用法
1.*.扩展名 *.do /abc/*.jpg
2.以/开头.以/*结尾 /admin/*
9.配置首页
welcome-file-list welcome-file
配置错误页面
error-page
1.error-code <location>
2.exception-type <location>
10.Servlet中获取请求头属性的方法
request.getHeader(name)
request.getIntHeader(name)
11.重要请求头
1.Content-Length:获得请求长度
2.Accept:浏览器能接受的MIME(它全名叫多用途互联网邮件扩展(Multipurpose Internet Mail Extensions),最初是为了将纯文本格式的电子邮件扩展到可以支持多种信息格式而定制的。后来被应用到多种协议里,包括我们常用的HTTP协议。MIME的常见形式是一个主类型加一个子类型,用斜线分隔。比如text/html、application/javascript、image/png等。在访问网页时,MIME type帮助浏览器识别一个HTTP请求返回的是什么内容的数据,应该如何打开、如何显示)类型
3.Referer:来路路径,代表请求从哪个页面转过来的.
12.提问:
Servlet的线程性质是什么?
多线程单实例
web.xml中可以配置哪些信息?
1.servlet
2.servlet-mapping
3.init-param load-on-startup
4.context-param
5.welcome-file-list welcome-file
6.error-page
Servlet初始化参数和全局参数有什么区别?
1.Servlet初始化参数只能在当前的servlet使用,不能在其他的servlet使用
2.全局参数可以在所有的servlet使用
如何获得请求参数?
request.getParameter(name)
如何获得请求属性头?
request.getHeader(name)
request.getIntHeader(name)
标签:Java,请求,Servlet,request,参数,servelt,servlet,name 来源: https://www.cnblogs.com/seventeen9588/p/16318108.html