Servlet学习笔记
Posted 努力挣扎的新生代农民工
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet学习笔记相关的知识,希望对你有一定的参考价值。
Servlet
Servlet 技术
什么是Servlet
- Servlet 是 JavaEE 规范之一。规范就是接口
- Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
- Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
手动实现Servlet程序
-
创建一个动态Web工程(创建过程见我的上一篇Tomcat学习笔记里的IDEA 中如何创建动态 Web 工程)
-
编写一个类去实现Servlet接口
-
实现service方法,处理请求,并响应数据
package com.hnust.servlet; import javax.servlet.*; import java.io.IOException; public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } /** * service方法是专门用来处理请求和响应的 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet 被访问了"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
-
到web.xml中去配置servlet程序的访问地址
<?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"> <!--servlet标签给Tomcat配置Servlet程序--> <servlet> <!--servlet-name标签给Servlet程序起一个别名(一般是类名)--> <servlet-name>HelloServlet</servlet-name> <!--servlet-class标签是Servlet程序的全类名--> <servlet-class>com.hnust.servlet.HelloServlet</servlet-class> </servlet> <!--servlet-mapping标签给servlet程序配置访问地址--> <servlet-mapping> <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用--> <servlet-name>HelloServlet</servlet-name> <!--url-pattern标签配置访问地址 <br/> / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/> /hello 表示地址为:http://ip:port/工程路径/hello <br/ --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
之后运行工程,首先会显示默认的index.jsp的对应内容
在地址栏后紧跟着输入/hello(我们在前面web.xml文件配置的时候已经将/hello绑定了Servlet程序)
这时候我们在IDEA上就可以看到
证明我们写的Servlet被访问了。
常见错误1:url-pattern 中配置的路径没有以斜杠打头。
常见错误2:servlet-name 配置的值不存在。
常见错误3:servlet-class 标签的全类名配置错误:
url 地址到 Servlet程序的访问
这里我直接贴尚硅谷的图片了,看的也是他们的视频
Servlet 的生命周期
- 执行 Servlet 构造器方法。
- 执行 init 初始化方法。 第1、2步,是在第一次访问的时候创建 Servlet 程序会调用。
- 执行 service 方法。 第3步,每次访问都会调用。
- 执行 destroy 销毁方法。 第4步,在 web 工程停止的时候调用
配置代码和运行结果如图所示
package com.hnust.servlet;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* service方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service方法 ===> Hello Servlet 被访问了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destroy方法");
}
}
GET 和 POST 请求的分发处理
package com.hnust.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* service方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service方法 ===> Hello Servlet 被访问了");
//使用getMethod()方法获取请求类型
//类型转换,因为HttpServletRequest才有getMethod()方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
if("GET".equals(method)){
doGet();
}else if ("POST".equals(method)){
doPost();
}
}
/**
* 做 get 请求的操作
*/
public void doGet(){
System.out.println("get 请求");
System.out.println("get 请求");
}
/**
* 做 post 请求的操作
*/
public void doPost(){
System.out.println("post 请求");
System.out.println("post 请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destroy方法");
}
}
通过继承 HttpServlet 实现 Servlet 程序
在实际的开发过程中,我们很少通过实现Servlet接口去实现Servlet程序,一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
- 编写一个类去继承 HttpServlet 类
- 根据业务需要重写 doGet 或 doPost 方法
- 到 web.xml 中的配置 Servlet 程序的访问地址
Servlet 类的代码
package com.hnust.servlet;
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 HelloServlet2 extends HttpServlet {
/**
* doGet()在get请求的适合调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2 的doGet方法");
}
/**
* doPost()在post请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2 的doPost方法");
}
}
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">
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.hnust.servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
</web-app>
使用IDEA创建Servlet程序
- 新建Servlet 程序
- 配置Servlet的信息
-
Name为Servlet-name
-
Package为类在哪个包下
-
Class为全类名
注意不要勾选下面的Create Java EE 6 annotated class(勾选会使用Servlet3.0以上版本的注解功能)
Servlet 类的继承体系
ServletConfig 类
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对 象。
ServletConfig 类的三大作用
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
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">
<!--servlet标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签给Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class标签是Servlet程序的全类名-->
<servlet-class>com.hnust.servlet.HelloServlet</servlet-class>
<!--init-param是初始化参数-->
<init-param>
<!--param-name是参数名-->
<param-name>username</param-name>
<!--param-value是参数值-->
<param-value>root</param-value>
</init-param>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址 <br/>
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
/hello 表示地址为:http://ip:port/工程路径/hello <br/
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
Servlet 中的代码 (重点为重写init方法):
package com.hnust.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
//1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet程序的别名是:"+ servletConfig.getServletName());
//2、获取初始化参数 init-param
System.out.println("初始化参数username的值是:"+ servletConfig.getInitParameter("username"));
//3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* service方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service方法 ===> Hello Servlet 被访问了");
//使用getMethod()方法获取请求类型
//类型转换,因为HttpServletRequest才有getMethod()方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
if("GET".equals(method)){
doGet();
}else if ("POST".equals(method)){
doPost();
}
}
/**
* 做 get 请求的操作
*/
public void doGet(){
System.out.println("get 请求");
System.out.println("get 请求");
}
/**
* 做 post 请求的操作
*/
public void doPost(){
System.out.println("post 请求");
System.out.println("post 请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destroy方法");
}
}
运行结果:
注意:如果使用getServletConfig()
方法获取 ServletConfig 对象,并重写init(ServletConfig config)
时,一定要继承父接口方法。因为getServletConfig()
方法返回的是GenericServlet里的config,而GenericServlet里的init()
方法将config保存在了本接口中,重写子类的init(ServletConfig config)
会使原先保存在父接口中的数据丢失。
下图为GenericServlet的init()方法源码
ServletContext类
什么是 ServletContext?
-
ServletContext 是一个接口,它表示 Servlet 上下文对象
-
一个 web 工程,只有一个 ServletContext 对象实例。
-
ServletContext 对象是一个域对象。
什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,操作范围为整个Web工程。
存数据 取数据 删除数据 MAP put() get() remove() 域对象 setAttribute() getAttribute() removeAttribute() -
ServletContext 是在 Web 工程部署启动的时候创建。在 Web 工程停止的时候销毁
ServletContext 类的四个作用
- 获取 web.xml 中配置的上下文参数 context-param
- 获取当前的工程路径,格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map 一样存取数据
新建Servlet方法,其中重写的doGet()方法为
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取 web.xml 中配置的上下文参数 context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param 参数 username 的值是:" + username);
//2. 获取当前的工程路径,格式: /工程路径
System.out.println("当前工程路径:"+context.getContextPath());
//3. 获取工程部署后在服务器硬盘上的绝对路径
/*
* / 斜杠被服务器解析地址为:http://ip:port/工程名/
* 其映射到 IDEA 代码的 web 目录
*/
System.out.println("工程部署的路径是:"+context.getRealPath("/"));
//4. 像 Map 一样存取数据
context.setAttribute("key1","value1");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
web.xml中新加标签如下:
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/contextServlet</url-pattern>
</servlet-mapping>
最终的运行结果如下
HTTP协议
什么是HTTP协议
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
所谓 HTTP 协议,就是指客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。 HTTP 协议中的数据又叫报文。
请求的HTTP协议格式
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。
请求又分为 GET 请求,和 POST 请求两种
- GET请求
- 请求行
- 请求的方式:GET
- 请求的资源路径+[?+请求参数](中括号内的内容可有可无)
- 请求的协议的版本号:HTTP/1.1
- 请求头
- 由key:value组成,不同的键值对表示不同的含义
- 请求行
下面这张还是贴的尚硅谷的图
- POST请求
- 请求行
- 请求的方式:GET
- 请求的资源路径+[?+请求参数](中括号内的内容可有可无)
- 请求的协议的版本号:HTTP/1.1
- 请求头
- 由key:value组成,不同的键值对表示不同的含义
- 空行
- 请求体
- 就是发送给服务器的数据
- 请求行
-
常用请求头的说明
上面两张图其实说的差不多了,这里挑几个典型的
- Accept: 表示客户端可以接收的数据类型
- Accpet-Languege: 表示客户端可以接收的语言类型
- User-Agent: 表示客户端浏览器的信息
- Host: 表示请求时的服务器 ip 和端口号
-
哪些是 GET 请求,哪些是 POST 请求
- GET请求:
- form 标签 method=get
- a 标签
- link 标签引入 css
- Script 标签引入 js 文件
- img 标签引入图片
- iframe 引入 html 页面
- 在浏览器地址栏中输入地址后敲回车
- POST请求
- form 标签 method=pos
- GET请求:
响应的 HTTP 协议格式
- 响应行
- 响应的协议和版本号
- 响应状态码
- 响应状态描述符
- 响应头
- 由key:value组成,不同的键值对表示不同的含义
- 空行
- 响应体
- 就是回传给客户端的数据
常见的响应码说明
- 200 表示请求成功
- 302 表示请求重定向
- 404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
- 500 表示服务器已经收到请求,但是服务器内部错误(基本上为代码错误)
MIME类型说明
MIME 是 HTTP 协议中数据类型。
MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。
常见的MIME类型
文件 | 类型 | MIME示例 |
---|---|---|
超文本标记语言文本 | .html , .htm | text/html |
普通文本 | .txt | text/plain |
RTF文本 | .rtf | application/rtf |
GIF图形 | .gif | image/gif |
JPEG图形 | .jpeg,.jpg | image/jpeg |
au声音文件 | .au | audio/basic |
MIDI音乐文件 | mid,.midi | audio/midi,audio/x-midi |
RealAudio音乐文件 | .ra, .ram | audio/x-pn-realaudio |
MPEG文件 | .mpg,.mpeg | video/mpeg |
AVI文件 | .avi | video/x-msvideo |
GZIP文件 | .gz | application/x-gzip |
TAR文件 | tar | application/x-tar |
谷歌浏览器如何查看HTTP协议
首先F12,之后如图
HttpServletRequest 类
HttpServletRequest 类有什么作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的 信息。
HttpServletRequest 类的常用方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的 ip 地址
- getHeader() 获取请求头 v. getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式 GET 或 POST
- setAttribute(key, value); 设置域数据
- getAttribute(key); 获取域数据
- getRequestDispatcher() 获取请求转发对象
配置代码及运行结果如下图所示
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">
<servlet>
<servlet-name>RequestAPIServlet</servlet-name>
<servlet-class>com.hnust.servlet.RequestAPIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestAPIServlet</servlet-name>
<url-pattern>/requestAPIServlet</url-pattern>
</servlet-mapping>
</web-app>
RequestAPIServlet.java
package com.hnust.servlet;
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 RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//getRequestURI() 获取请求的资源路径
System.out.println("URI => " + req.getRequestURI());
//getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println("URL => " + req.getRequestURL());
//getRemoteHost() 获取客户端的 ip 地址
/*
* 在 IDEA 中,使用 localhost 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
* 在 IDEA 中,使用 127.0.0.1 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
* 在 IDEA 中,使用 真实 ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
*/
System.out.println("客户端 ip 地址 => " + req.getRemoteHost());
//getHeader() 获取请求头 v. getParameter() 获取请求的参数
System.out.println("请求头 User-Agent ==>> " + req.getHeader("User-Agent"));
//getMethod() 获取请求的方式 GET 或 POST
System.out.println( "请求的方式 ==>> " + req.getMethod());
}
}
运行结果:
如何获取请求参数
配置代码及运行结果如下图所示
form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_Servlet/parameterServlet" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">Java<br/>
<input type="submit">
</form>
</body>
</html>
ParameterServlet.java
package com.hnust.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.util.Arrays;
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
System.out.println("兴趣爱好:" + Arrays.asList(hobby));
}
}
web.xml中新增标签
<servlet>
<servlet-name>ParameterServlet</servlet-name>
<servlet-class>com.hnust.servlet.ParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParameterServlet</servlet-name>
<url-pattern>/parameterServlet</url-pattern>
</servlet-mapping>
表单输入及运行结果
Post请求的中文乱码解决
在获取参数前设置
req.setCharacterEncoding("UTF-8");
请求转发
请求转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作。
假设Servlet1转发到Servlet2,则Servlet1中的protected void doGet(HttpServletRequest req, HttpServletResponse resp)
方法中最后加入
/*
* 请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
*
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
// 走向 Sevlet2
requestDispatcher.forward(req,resp);
base标签的作用
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转
例如在<head></head>
>中加入标签
<base href="http://localhost:8080/07_Servlet/a/b/c.html">
之后再使用<a href="../../index.html">跳回首页</a>
相当于使用
<a href="http://localhost:8080/07_Servlet/a/b/c.html../../index.html">
。
../
表示返回到当前文件的上一级目录,使用上一个标签也就是相当于使用
<a href="http://localhost:8080/07_Servlet/index.html">
web 中 / 斜杠的不同意义
在 web 中 / 斜杠 是一种绝对路径
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析,得到 http://ip:port/
HttpServletResponse 类
HttpServletResponse 类的作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息。
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
如何往客户端回传数据
往客户端回传字符串数据
public class Responseioservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
// 要求 : 往客户端回传 字符串 数据。
PrintWriter writer = resp.getWriter();
writer.write("回传内容");
}
}
解决响应中文乱码方案一(不推荐使用):
// 设置字符集需要将服务器和浏览器的字符集统一,不然还是乱码
// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
解决响应中文乱码方案二(推荐使用):
此方法一定要在获取流对象之前调用才有效
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
resp.setContentType("text/html; charset=UTF-8");
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。
http://localhost:8080/07_Servlet/response2
请求重定向的第一种方案
// 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");
请求重定向的第一种方案(推荐)
resp.sendRedirect("http://localhost:8080");
Servlet 学习笔记①
- dd
- dd
- dd
- dd
- dd
- dd
- ServletConfig: 封装了Servlet 的配置信息,并且可以获取 ServletContext 对
- 配置初始化参数:
<servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>servlettest.HelloServlet</servlet-class> <!-- 配置Servlet 初始化参数, 且该节点必须在load-on-startup 的前面 --> <init-param> <!-- 参数名 --> <param-name>username</param-name> <!-- 参数值 --> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>12345</param-value> </init-param> <!-- 指定Servlet被创建的时机 --> <load-on-startup>-1</load-on-startup> </servlet>
-
- 获取初始化参数:
- getInitParameter(String name): 获取指定参数名的初始化参数
- getInitParameterNames(): 获取参数名组成的Enumeration对象
- getServletName():用的比较少:
- 获取初始化参数:
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("This is init"); String user = servletConfig.getInitParameter("user"); System.out.println("user=" + user); Enumeration<String> parameterNmaes = servletConfig.getInitParameterNames(); while (parameterNmaes.hasMoreElements()){ String name = parameterNmaes.nextElement(); String value = servletConfig.getInitParameter(name); System.out.println(name + " = " + value); } String servletName = servletConfig.getServletName(); System.out.println(servletName); }
以上是关于Servlet学习笔记的主要内容,如果未能解决你的问题,请参考以下文章