什么是servlet?
Servlet是一种运行于服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面
它担当客户请求与服务器响应的中间层 。
servlet与jsp
在JSP技术未问世以前,Servlet和Applet分别是Java在服务器段和客户端所推广的解决方案,两者相辅相成,各占优势。
Servlet是在Java代码中嵌入页面代码,JSP是在页面代码中嵌入Java代码
JSP不能执行,必须转译成Servlet并编译成class后才能执行
Servlet是学好JSP的基础,能了解JSP的底层运作方式。
HttpServlet类
httpServlet中各种接受请求处理的方法。
- doGet():处理http的get请求
- doPost():处理http的post请求,主要用于发送HTML文本中FORM的内容。
- doHead():用于处理HEADER请求
- doPut():处理http的put请求,模仿 ftp发送
- doDelete():处理http的delete请求
- doOptions():该操作自动决定支持什么HTTP方法。
- doTrace():处理HTTP的trace请求。
package com.mipo.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* API中提供了两种不同类型的servlet类,可根据需要决定继承哪个servlet来实现。
* 一般继承HttpServlet
* 创建步骤:
* 1、创建自定义servlet类继承的父类
* 2、实现init()方法进行初始化设置
* 3、根据客户端请求方式决定用doXXX()方法
* 4、在destroy()中进行善后处理工作
*/
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
//初始化方法
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
String initParameter = config.getInitParameter("name");
}
//构造方法
public Login() {
super();
}
/*
get提交方式的编码
修改tomcat安装目录\conf\server.xml中:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
中加入属性URIEncoding=“编码类型"后重启服务器
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String qq = request.getParameter("qq");
String sex = request.getParameter("sex");
String hobby[] = request.getParameterValues("hobby");
String country = request.getParameter("country");
PrintWriter out = response.getWriter();
out.println("你的QQ号是:"+qq);
out.println("你的性别是:"+sex);
out.println("你的爱好是:");
for(int i=0;i<hobby.length;i++) {
out.print(hobby[i]+"\t");
}
out.println("你的国籍是:"+country);
}
//从http得到post请求并回复
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//setCharacterEncoding(String EncodingCode)该方法用于设置接收参数的编码类型,仅适用于post提交方式
request.setCharacterEncoding("UTF-8");
//String getParameter(String CtlName)方法:可取得用户在表单或URL中向服务器传送的相应参数,
//其中的CtlName代表html表单中控件的名称或在URL地址中传递的参数的名称
String name = request.getParameter("text");
String pwd = request.getParameter("pwd");
//void setContentType(String TYPE)方法:设置输出流的数据类型。
//向客户端回应一个超文本文件,其编码为charset所指定的编码。
response.setContentType("text/html; charset=UTF-8");
//PrintWriter getWriter()方法:获得向客户端进行文本输出的控制流
//ServletOutputStream getOutputStream()方法: 获得向客户端输出二进制数据的控制流
PrintWriter writer = response.getWriter();
if(name.equals("韩非") && pwd.equals("123456")) {
writer.println("<font color=blue>"+name+",欢迎回来"+"</font><br>");
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/personinfo.jsp");
rd.forward(request, response);
}else {
writer.println("<font color=red>"+"登录失败"+"</font>");
}
}
//释放资源
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
}
}
Servlet在Tomcat下的配置
在web.xml文件中配置<servlet>和<servlet-mapping>
<servlet>
<servlet-name>Servlet的名称</servlet-name>
<servlet-class>该servlet类的路径</servlet-class>
<init-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</init-param>
<jsp-file>/路径/XXX.JSP </jsp-file>
<load-on-startup>表示web站台被启动时,自动加载该servlet的
优先级别,越小越优先加载
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>对应的servlet-name名称</servlet-name>
<url-pattern>在项目运行时用以访问的URL </url-pattern>
</servlet-mapping>
url-pattern 取值:
1、可以与具体的某个Servlet对应。
2、也可以用/* 来指定所有的页面。
配置示例
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>JavaServerPages详解</display-name>
<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>
<servlet>
<description></description>
<display-name>Login</display-name>
<!-- Servlet的名称 -->
<servlet-name>Login</servlet-name>
<!-- 该Servelet类的路径 -->
<servlet-class>com.mipo.servlet.Login</servlet-class>
<init-param>
<!-- 参数名 -->
<param-name>encoding</param-name>
<!-- 参数值 -->
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 对应的servlet-name名称 -->
<servlet-name>Login</servlet-name>
<!-- 在项目运行时用于访问的URL -->
<!-- url-pattern取值:1、可以与具体的某个servlet对应 2、也可以用/*来指定所有的页面 -->
<url-pattern>/Login</url-pattern>
</servlet-mapping>
</web-app>
servlet的生命周期
每个servlet实例的生命周期中只有三种类型的事情,分别对应于由servlet容器所调用的三个方法:
- init() 初始化时期
当servlet第一次被装载的时候由servlet容器调用init(),且只调用一次,默认情况下调用超类的init()方法。
- service()运行时期
接受客户请求并决定调用何种doXXX方法,并将处理结果返回到客户端。
- destroy()结束时期
为可选方法,释放不用的servlet实例所占内存和资源。
Servlet的生命周期可以归纳为以下几步
- Servlet创建一个Servlet实例;
- Servlet调用Servlet的init()方法;
- 客户发送请求到Servlet;
- Servlet创建一个请求对象和一个响应对象
- Servlet调用service()方法,传递请求和响应对象作为参数;
- service()方法获得请求对象的参数,处理请求,访问其他资源。
- service()方法通过响应对象将结果传递给Server,最终到达客户端。
- 对于更多的相同客户端请求, Servlet将创建新的请求和响应对象,仍然激活此Servlet的service方法,传递新的参数对象,不需在初始化一次。
- 当Servlet不再需要Servlet时(关闭时)调用destory()方法。