Servlet接口:Web服务端的编程技术,实现动态网页的解决方案,是jsp技术的基础
Servlet源码:
Servlet接口定义了Servlet引擎与Servlet程序之间通信的协议约定。
// Compiled from Servlet.java (version 1.8 : 52.0, no super bit)
public abstract interface javax.servlet.Servlet {
被servlet容器调用,并根据初始化信息来创建一个servlet实例
// Method descriptor #4 (Ljavax/servlet/ServletConfig;)V
public abstract void init(javax.servlet.ServletConfig arg0) throws javax.servlet.ServletException;
得到servlet的初始化信息和启动参数
// Method descriptor #8 ()Ljavax/servlet/ServletConfig;
public abstract javax.servlet.ServletConfig getServletConfig();
接受客户请求并返回相应信息
// Method descriptor #10 (Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V
public abstract void service(javax.servlet.ServletRequest arg0, javax.servlet.ServletResponse arg1) throws javax.servlet.ServletException, java.io.IOException;
返回servlet相关信息,包括作者、版本、版权等
// Method descriptor #13 ()Ljava/lang/String;
public abstract java.lang.String getServletInfo();
被servlet容器调用,当该servlet不用的时候释放掉所占用的所有资源
// Method descriptor #15 ()V
public abstract void destroy();
}
理解Servlet中service方法的作用:https://blog.csdn.net/y_love_f/article/details/38962025
Servlet接口说明
1、该接口只定义了servlet和客户端联系的方法并无实现。
2、在servlet开始接收客户请求前由servlet容器调用init()方法对其初始化,并将该实例放到服务器中。
3、service()方法被servlet容器调用接受客户的请求并处理。
ServletRequest类:包含客户端的请求信息。
ServletResponse类:包含服务器作出的回应。
该方法会抛出ServletException和IOException两个异常。
4、当servlet实例长期不用,将被servlet容器通过垃圾处理器回收,并释放其所占的资源。
Servlet2.4新增的功能:
1.Filter(过滤器)
2.Listener(监听器):监听在控制层的某一个过程,根据过程需求作出响应
Servlet API中定义的两个包:
包:
javax.servlet.*
javax.servlet.http.*
两个抽象类:
GenericServlet,HttpServlet抽象类:都实现Servlet接口,后者继承前者,后者增加了doGet,doPost,doPut,doHead,doDelete。。。。方法
public abstract class HttpServlet extends GenericServlet implements Serializable {
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
}
protected void doPut(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
}
..........
protected void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
}
doGet():处理http的get请求,从http服务器上取得资源。
doPost():处理http的post请求,主要用于发送HTML文本中FORM的内容。
doHead():用于处理HEADER请求
doPut():处理http的put请求,模仿ftp发送资源。
doDelete():处理http的delete请求,从服务器上移出一个url。
doOptions():该操作自动决定支持什么HTTP方法。
doTrace():处理HTTP的trace请求。
HttpServletRequest,HttpServletResponse接口:
1.HttpServletRequest接口封装了http协议的客户端请求相关的内容,利用此接口可取得用户的输入,也可取得客户的配置。
String getParameter(String CtlName)方法:可取得用户在表单或URL中向服务器传送的相应参数,其中的CtlName代表html表单中控件的名称或在URL地址中传递的参数的名称
setCharacterEncoding( String encodingCode);
• 该方法用于设置接收参数的编码类型。
2.HttpServletResponse接口封装了http协议的服务器响应相关的内容,利用此接口可获得向浏览器或其他http客户端输出响应结果的输出流。
PrintWriter getWriter()方法:获得向客户端进行文本输出的控制流
ServletOutputStream getOutputStream()方法: 获得向客户端输出二进制数据的控制流
void setContentType(String TYPE)方法:设置输出流的数据类型。如果要设置输出
的数据类型,必须首先调用此方法对输出流的数据类型进行设定。
• TYPE的取值类型:
• text/html[;charset=charEncoding]
• 比如:response.setContentType("text/html;charset=utf-8");
• 向客户端回应一个超文本文件,其编码为charset所指定的编码。如果省略了charset指定,将采用服务器端的默认的编码
• 说明:如果响客户端回应的内容含有中文,且采用JDK自带的编译器进行编译(编译时不指定编码类型),则需要利用charset参数指定文档的编码类型为GBK或GB2312,否则向客户端输出的中文内容将是乱码
案例:
package com.sc.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
@WebServlet("/register")
public class SayHi extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.请求
req.setCharacterEncoding("utf-8");
String name = req.getParameter("uname");
System.out.println("用户名:" + name);
//2.响应
resp.setContentType("text/html;charset=gbk");
PrintWriter out = resp.getWriter();
out.println("你好," + name);
out.close();
}
}
<body>
<form action="register" method="post">
用户名:<input type="text" name="uname"><br>
密 码:<input type="password" name="upass"><br>
性 别:<input type="radio" >
<input type="submit" value="提交">
</form>
两种Servlet配置:
1.通过xml配置文件:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.servletExample.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
2.添加注解@WebServlet("/HelloServlet")
浏览器 访问Servlet:http://localhost:8080/ServletExample/HelloServlet
Servlet的生命周期
每个servlet实例的生命周期中只有三种类型的事情,分别对应于由servlet容器所唤醒的三个方法:
1、init() 初始化时期
• 当servlet第一次被装载的时候由servlet容器调用init(),且只调用一次,默认情况下调用超类的init()方法。
2、service()运行时期
• 接受客户请求并决定调用何种处理方法,并将处理结果返回到客户端。
3、destory()结束时期
• 为可选方法,释放不用的servlet实例所占内存和资源。
Servlet的生命周期可以归纳为以下几步
由Servlet容器动态装载Servlet;
Servlet创建一个Servlet实例;
Servlet调用Servlet的init()方法;
客户发送请求到Servlet;
Servlet创建一个请求对象;
Servlet创建一个响应对象;
Servlet激活service()方法,传递请求和响应对象作为参数;
service()方法获得请求对象的参数,处理请求,访问其他资源。
service()方法通过响应对象将结果传递给Server,最终到达客户端。
对于更多的相同客户端请求, Servlet将创建新的请求和响应对象,仍然激活此Servlet的service方法,传递新的参数对象,不需在初始化一次。
当Servlet容器不再需要Servlet时(关闭时)调用destory()方法。
在JSP页面写${msg},无法显示msg信息!需要设置EL表达式,配置isELIgnored="false"。
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>