一、Servlet接口概述
Servlet接口–》通过Servlet接口,提供了一个Servlet所应该具备的所有功能
GenericServlet类—》实现了Servlet接口,并且实现了大部分的方法,但是service方法没有实现
HttpService类–》继承了GenericServlet类,并且实现了service方法,会判断请求方式,根据不同的请求方式,调用不同的doXXX方法。
二、Servlet程序使用案例
1、Servlet程序访问过程
Servlet创建之后会自动生成web.xml里面的servlet配置以及一个java文件。
web.xml文件解释
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
浏览器可以书写一个url,访问我们的servlet程序,当url访问servlet时,就可以调用servlet对应doXXX方法,执行对应的逻辑处理。
浏览器的url:http://localhost:8080/web应用名/具体的servlet定位符
url解释:
localhost:8080:tomcat服务器访问地址
web应用名:web应用发布时的application context的值,一般和项目名相同比较好
具体的servlet定位符:主要定位使用哪个servlet程序,利用web.xml的8行配置,url-pattern的值就是servlet定位符
最终的访问路径是:http://localhost:8080/TestServlet1_war_exploded/ServletTest
/ServletTest的值会跟url-pattern匹配,如果相同则定位到了具体的资源,然后找servlet-mapping中的servlet-name的值,让这个值跟servlet中的
servlet-name值进行匹配,如果两个值相同,则找相邻的servlet-class的值,这个值就是当前url访问servlet的全路径,就可以通过url调用该servlet程序
-->
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.weq.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
</web-app>
运行结果:
且浏览器能正常访问http://localhost:8080/TestServlet1_war_exploded/ServletTest
2、通过创建html测试Servlet程序
在web目录创建html文件,文件代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试servlet的get和post</title>
</head>
<body>
<h1>GET方式</h1>
<form action="http://localhost:8080/TestServlet1_war_exploded/ServletTest" method="get">
<input type="submit">
</form>
<h1>POST方式</h1>
<form action="http://localhost:8080/TestServlet1_war_exploded/ServletTest" method="post">
<input type="submit">
</form>
</body>
</html>
修改ServletTest.java文件,添加输出的内容,代码如下:
package com.weq;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用了doPost方法");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("调用了doGet方法");
}
}
重新deploy访问测试,测试结果如下:
可以看到调用到了后端的doGet和doPost方法
三、Request
1、概述
Request对象用来解析请求参数,当浏览器访问服务器时,携带着一些请求参数,可以通过Servlet提供的Request对象提供的API来解析请求参数
请求对象有两个:
ServletRequest
httpServletRequest
2、常用的方法:
getParameter("参数名")--根据参数名获取参数的值
getParameterValues()--获取到所有参数的值并存入数组
setCharacterEncoding()--设置请求的字符编码方式
getCharacterEncoding()--返回字符编码方式
setAttribute(String,Object) 存储此请求中的属性
getAttribute(String name) 返回指定属性的属性值
3、测试
新建sevlet程序
web.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
浏览器可以书写一个url,访问我们的servlet程序,当url访问servlet时,就可以调用servlet对应doXXX方法,执行对应的逻辑处理。
浏览器的url:http://localhost:8080/web应用名/具体的servlet定位符
url解释:
localhost:8080:tomcat服务器访问地址
web应用名:web应用发布时的application context的值,一般和项目名相同比较好
具体的servlet定位符:主要定位使用哪个servlet程序,利用web.xml的8行配置,url-pattern的值就是servlet定位符
最终的访问路径是:http://localhost:8080/TestServlet1_war_exploded/ServletTest
/ServletTest的值会跟url-pattern匹配,如果相同则定位到了具体的资源,然后找servlet-mapping中的servlet-name的值,让这个值跟servlet中的
servlet-name值进行匹配,如果两个值相同,则找相邻的servlet-class的值,这个值就是当前url访问servlet的全路径,就可以通过url调用该servlet程序
-->
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.weq.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>requestTest</servlet-name>
<servlet-class>com.weq.requestTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>requestTest</servlet-name>
<url-pattern>/requestTest</url-pattern>
</servlet-mapping>
</web-app>
requestTest.java代码如下:
package com.weq;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class requestTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("===========获取请求行信息===========");
String method = request.getMethod();
System.out.println("请求方式是:"+method);
String requestURI = request.getRequestURI();
System.out.println("请求url是:"+requestURI);
String protocol = request.getProtocol();
System.out.println("请求协议是:"+protocol);
System.out.println("===========获取请求头信息===========");
System.out.println("请求HOST是:"+request.getHeader("Host"));
System.out.println("请求Sec-Ch-Ua是:"+request.getHeader("Sec-Ch-Ua"));
}
}
运行结果:
请求转发概述
请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程,就叫做请求转发,具有以下特点:
1,请求转发整个过程是一次请求、一次响应
2,请求转发前后,浏览器地址栏地址不会发生变化(浏览器–访问–>A–转发–>B,地址栏地址始终指向A的地址)
3,请求转发前后的request对象是同一个
4,转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发
5,使用代码: request.getRequestDispatcher(访问目的资源的路径).forward(request,response);
6,也可以使用 setAttribute()/getAttribute()来验证
请求转发测试
创建一个名为requestTest1的servlet,再创建一个html,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>借钱案例</title>
</head>
<body>
<form action="http://localhost:8080/TestServlet1_war_exploded/requestTest1">
小明向小刚借钱:<input type="text" name="money">
<input type="submit">
</form>
</body>
</html>
requestTest1.java代码如下:
package com.weq;
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 requestTest1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Integer qian=1000;
response.setContentType("text/html;charset=utf-8");
String money = request.getParameter("money");
System.out.println("小明向小刚借了:" + money + "元");
PrintWriter writer = response.getWriter();
if (Integer.parseInt(money)<qian) {
writer.write("小明向小刚借了:" + money + "元");
}else {
System.out.println("没钱了,借不了");
request.setAttribute("money",money);
request.getRequestDispatcher("/requestTest2").forward(request,response);
}
}
}
再创建一个servlet,代码如下:
package com.weq;
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 requestTest2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/htlm;charset=utf-8");
String money = request.getParameter("money");
PrintWriter writer = response.getWriter();
writer.write("小明向小红借了" + money+"元");
}
}
代码运行结果如下:
四、response
1、概述
Response是代表Http响应信息的对象,其中将会封装服务器要发送给浏览器的响应信息,将response对象作为参数传递给service方法,在service方法处理请求的过程中,可以将要发送给浏览器的数据,先写入response对象中,在service方法执行完后,服务器负责从response对象中获取到响应信息,再按照http响应信息的格式组织成响应消息,发送给浏览器。
2、常用的方法:
setContentType(“参数名”)–设置响应的字符编码方式
sendRedirect()–完成重定向
getOutputStream()–获取字节输出流
getWriter()–获取字符输出流
3、测试
创建一个名为reponseTest的servlet
web.xml的代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
浏览器可以书写一个url,访问我们的servlet程序,当url访问servlet时,就可以调用servlet对应doXXX方法,执行对应的逻辑处理。
浏览器的url:http://localhost:8080/web应用名/具体的servlet定位符
url解释:
localhost:8080:tomcat服务器访问地址
web应用名:web应用发布时的application context的值,一般和项目名相同比较好
具体的servlet定位符:主要定位使用哪个servlet程序,利用web.xml的8行配置,url-pattern的值就是servlet定位符
最终的访问路径是:http://localhost:8080/TestServlet1_war_exploded/ServletTest
/ServletTest的值会跟url-pattern匹配,如果相同则定位到了具体的资源,然后找servlet-mapping中的servlet-name的值,让这个值跟servlet中的
servlet-name值进行匹配,如果两个值相同,则找相邻的servlet-class的值,这个值就是当前url访问servlet的全路径,就可以通过url调用该servlet程序
-->
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.weq.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>requestTest</servlet-name>
<servlet-class>com.weq.requestTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>requestTest</servlet-name>
<url-pattern>/requestTest</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>reponseTest</servlet-name>
<servlet-class>com.weq.reponseTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reponseTest</servlet-name>
<url-pattern>/reponseTest</url-pattern>
</servlet-mapping>
</web-app>
reponseTest.java代码如下:
package com.weq;
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 reponseTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ServletOutputStream outputStream = response.getOutputStream();
PrintWriter writer = response.getWriter();
writer.write("你好,响应请求");
}
}
测试结果如下:
发现出现乱码,需要设置响应的字符编码方式
代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("你好,响应请求");
}
测试结果:
重定向测试redirect
代码如下:
public class reponseTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("你好,响应请求");
response.sendRedirect("form.html"); //跳转到另一个html
}
}
测试结果
正常跳转,也可以跳转到其他服务器上,比如www.baidu.com