一.第一个Servlet的实现
1.方式一:新建Servlet 继承HttpServlet类
①新建普通java类
②继承HttpServlet类
③重写service()方法
④配置web.xml文件,设置servlet对外访问 路径
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("Servlet01的创建....");
}
}
2.方式二:继承GenericServlet类
①新建普通java类
②继承GenericServlet类
③重写service()方法
④配置web.xml文件,设置servlet对外访问 路径
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@SuppressWarnings("serial")
public class Servlet02 extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Servlet02.....");
}
}
3.方式三:实现Servlet接口
①新建普通java类
②实现Servlet接口
③重写service()方法
④配置web.xml文件,设置servlet对外访问 路径
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Servlet03 implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Servlet03....");
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
4.Servlet的生命周期
实例和初始化时机
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会
创建实例并 进行初始化。
就绪/调用/服务阶段
有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在
整个声明周 期中可以被多次调用;
HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认
情况下,会抛出异常,需要子类去 override。
销毁时机
当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。
上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 有三个生命周 期方法,不由用户手动调用,
而是在特定的时机有容器自动调用,
观察这三个生命周期方法 即可观察到 Servlet 的生命周期。
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet04 extends HttpServlet {
/**
* 初始化,服务器方式,由服务器调用
* 只会调用一次,当第一次请求时
* 当请求到达servlet时,servlet容器会判断该实例是否存在,如果不存在,才会调用该方法
*/
@Override
public void init() throws ServletException {
System.out.println("Servlet04 init....");
}
/**
* 服务/调用方法,服务器方式,由服务器调用
* 可以调用多次,每次请求到达时都会调用
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet04...");
}
/**
* 销毁方法,服务器方式,由服务器调用
* 只会调用一次,容器关闭时(正常关闭时才会打印)
*/
@Override
public void destroy() {
System.out.println("Servlet04 destroy...");
}
}
5. Servlet的配置
①初始化参数
设置在web.xml中的servlet标签中
<init-param>
<param-name><param-/name>
<param-value></param-value>
</init-param>
②自启动(服务器启动时自动实例化servlet)
设置在web.xml中的servlet标签中,要写在init-param标签之后
<load-on-startup>1</load-on-startup>
值越小,优先级越高
③servlet配置多个访问路径
以Servlet05为例:
a. 只设置一个路径
<url-pattern>/ser05</url-pattern>
b.设置多个路径
<url-pattern>/ser05</url-pattern>
<url-pattern>/ser005</url-pattern>
c.以指定路径开头的所有资源路径
<url-pattern>/test/*</url-pattern>
d.以指定后缀结尾的所有资源路径
<url-pattern>*.html</url-pattern>
e.所有路径都可以访问
<url-pattern>*</url-pattern>
通配符"*"
①"*"只能放在最前面或者最后面,不能放在中间,不能单独使用,不能和字母拼接
②值越精准,优先级越高
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet05....");
}
@Override
public void init(ServletConfig config) throws ServletException {
// 得到指定名称的的初始化的值
String encode = config.getInitParameter("encode");
System.out.println(encode);
}
}
二.常用形式
1.常用方法
2.获取请求头
3.获取客户端请求参数(客户端提交的数据)
package com.shsxt.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet01.....");
System.out.println("==============常用方法============");
// 获取请求的完整路径 (从http到"?"前面)
String url = request.getRequestURL() + "";
System.out.println("获取请求的完整路径:" + url);
// 获取请求的部分路径 (从端口后"?"前面)
String uri = request.getRequestURI();
System.out.println("获取请求的部分路径:" + uri);
// 获取请求的参数字符串 (从"?"开始到最后)
String queryString = request.getQueryString();
System.out.println("获取请求的参数字符串:" +queryString);
// 获取请求类型 (GET/POST)
String method = request.getMethod();
System.out.println("获取请求类型:" + method);
// 获取请求协议版本
String p = request.getProtocol();
System.out.println("获取请求协议版本:" + p);
// 获取站点名
String contextPath = request.getContextPath();
System.out.println("获取站点名:" + contextPath);
System.out.println("===========获取请求头==========");
// 获取指定请求头
String host = request.getHeader("host");
System.out.println("Host:" + host);
// 获取所有请求头的名称枚举集合
Enumeration<String> enumeration = request.getHeaderNames();
while(enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement());
}
System.out.println("==========获取请求的参数===========");
// 获取指定名称的参数值
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
System.out.println("用户名:" + uname + ",用户密码:" +upwd);
// 获取指定名称的参数的所有值
String[] hobbys = request.getParameterValues("hobby");
// 判断并遍历
if (hobbys != null && hobbys.length > 0) {
for (String hobby : hobbys) {
System.out.println("爱好:" + hobby);
}
}
}
}
三.请求转发
request.getRequestDispatcher(url).forward(request, response);
①服务器行为,服务器行为
②地址栏不会发生改变
③只有一次请求,request对象共享
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet03....");
// 获取参数
String uname = request.getParameter("uname");
System.out.println("Servlet03:" + uname);
// 请求转发跳转到指定页面
// request.getRequestDispatcher("index.html").forward(request, response);
// 请求转发跳转到指定servlet
request.getRequestDispatcher("ser04").forward(request, response);
}
}
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 请求转发
* request.getRequestDispatcher(url).forward(request, response);
* @author Lisa Li
*
*/
@SuppressWarnings("serial")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet04....");
// 获取参数
String uname = request.getParameter("uname");
System.out.println("Servlet04:" + uname);
}
}
四.request域对象
将数据存到request作用域中,前台页面(JSP)从作用域中获取域对象的值
setAttribute(name,value):设置作用域,name是字符串类型,value是object类型
getAttribute(name):获取指定名称的域对象的值,返回的是object类型
removeAttribute(name):移除指定名称的域对象的值
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet05....");
// setAttribute(name,value):设置作用域,name是字符串类型,value是object类型
request.setAttribute("userName", "Lisa");
// 请求转发跳转到index.jsp
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
五.数据响应
getWriter()获取字符流(只能响应回字符);
getOutputStream()获取字节流(能响应一切数据)。
响应回的数据到客户端被浏览器解析。
注意:两者不能同时使用。
java.lang.IllegalStateException: getWriter() has already been called for this response
package com.shsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet02 extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet02...");
// 设置响应类型 默认是纯文本
response.setContentType("text/html");
// 得到输出流 字符输出流
/*PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h3>Hello</h3>");
writer.close();*/
// 得到字节输出流
ServletOutputStream out = response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h3>Hello</h3>".getBytes());
out.close();
}
}
getWriter()获取字符流(只能响应回字符);
getOutputStream()获取字节流(能响应一切数据)。
响应回的数据到客户端被浏览器解析。
注意:两者不能同时使用。
package com.shsxt.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet03...");
// 设置响应类型 默认是纯文本
/*response.setContentType("application/json");
String json = "{\"uanme\":\"zhangsan\",\"upwd\":\"123\"}";
// 得到输出流 字符输出流
PrintWriter writer = response.getWriter();
writer.write(json);
writer.close();*/
response.setContentType("text/html");
String form = "<form action='ser02' method='get'> userName: <input type='text' name='uname' /> <br/> userPwd: <input type='password' name='upwd' /> <br/> <input type='submit' value='Login' /> </form>";
// 得到输出流 字符输出流
PrintWriter writer = response.getWriter();
writer.write(form);
writer.close();
}
}