Servlet概述
首先得知道,Servlet=Server+Applet,Servlet主要用于处理各种业务逻辑,它比JSP更具有业务逻辑层的意义。
最初的JSP开发模式为:JSP+JavaBean,慢慢演变为:JSP+JavaBean+Servlet。
Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序,除了Java Servlet API,它还可以用于扩展和添加API的Java类软件包。
Servlet功能
Servlet通过创建一个框架扩展服务器的能力,以在web上提供请求和响应服务,当客户端发送请求至服务器时,服务器可以将请求信息发送给Servlet,并让其建立服务器返回给客户端的响应。当启动web服务器和客户端第一次请求服务时,可以自动装入Servlet,之后Servlet继续运行直至其他客户端发生请求。
Servlet的主要功能:
- 创建并返回一个基于客户请求性质的动态内容的完整HTML页面。
- 创建可嵌入到现在HTML页面中的部分HTML页面(HTML片段)。
- 与其他服务器资源(包括数据库和基于Java的应用程序)通信。
- 用多个客户端处理连接,接收多个客户端的输入,并将结果传递到多个客户端,例如:Servlet可以是多参与者的游戏服务器。
- 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至Applet的新连接,并将该连接保持打开状态;当允许客户端和服务器简单且高效的执行会话的情况下,Applet也可以启动客户浏览器和服务器之间的连接,可以通过定制协议来通信。
- 将定制的处理提供给所有服务器的标准程序,如Servlet可以修改如何认证用户。
- -
Servlet特点
Servlet技术最大的优势就是可以处理客户端传来的HTTP请求,并返回一个响应。
- 高效:在服务器上仅有一个Java虚拟机在运行,其优势在于当多个来自客户端的请求访问时,Servlet为每个请求分配一个线程,而不是进程。
- 方便:Servlet提供了大量的使用工具例程,如:处理很难完成的HTML表单数据、读取和设置HTTP头,以及处理Cookie和跟踪会话。
- 跨平台:Servlet用Java编写。
- 功能强大:Servlet可以直接与web服务器交互,还能再各个程序间共享数据,使得数据库连接池之类的功能很容易实现。
- 灵活性和可扩展性
- 共享数据
- 安全
Servlet的生命周期
Servlet部署在容器里,生命周期由容器管理。
1)当用户请求Servlet服务时或启动web服务器时,容器环境加载一个Java Servlet类。
2)容器环境将根据用户请求创建一个或者多个Servlet对象实例,并将这些实例加入到Servlet实例池中。
3)容器环境调用Servlet的初始化方法HttpServlet.init(ServletConfig config)完成初始化,这是需要传递参数,其中包含初始化参数和容器环境的信息,并负责向Servlet传递数据。如果传递失败,则会抛出ServletException异常,Servlet将不能正常工作。
4)容器环境利用一个HttpServletRequest和HttpServletResponse对象封装从Web容器接收到的HTTP请求和有Servlet生成的响应。
5)环境容量把HttpServletRequest和HttpServletResponse对象传递给HttpServlet.service()方法,service()可被多次调用,各调用过程在不同的线程,互不干扰。
6)定制的Java Servlet从HttpServletRequest对象读取HTTP请求数据,访问来自HTTPSession或Cookie对象的状态信息,执行特定应用的处理并且用HttpServletResponse对象生成HTTP响应数据。
7)当web服务器和容器关闭时会自动调用HttpServlet.destroy()方法关闭所有打开的资源。
Servlet核心API
- Servlet接口
//Servlet在处理客户端的请求时调用此方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
//当Servlet容器移除Servlet对象时调用此方法,以释放资源
public void destroy()
//用于获取Servlet对象的配置信息,返回ServletConfig对象
public ServletConfig getServletConfig()
//返回有关Servlet的信息,是纯文本格式的字符串
public String getServletInfo()
- HttpServlet类
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException //处理请求类型为GET的Http请求的处理方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException //处理请求类型为Post的Http请求的处理方法
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException //处理请求类型为Put的Http请求的处理方法
- HttpServletRequest接口
//常用方法
public Cookie[] getCookies() //返回所有Cookie对象
public String getMethod() //返回HTTP请求类型
public String getContextPath() //返回上下文路径
public String getQueryString() //返回请求的查询字符串
public String getRequestURI() //返回主机名到请求参数之间的部分字符串
public HttpSession getSession() //返回与主机关联的HttpSession对象
- HttpServletResponse接口
//常用方法
public void addCookie(Cookie cookie) //向客户端发送Cookie信息
public void sendError(int i) throws IOException //发送一个错误状态码为i的错误响应到客户端
public void sendError(int i, String s) throws IOException //发送一个错误状态码为i的错误响应到客户端
public void sendRedirect(String s) throws IOException //将客户端请求重定向到新的URL
Servlet的配置
Servlet的配置有两种方法,一种是在web.xml文件中配置,另一种是采用注解配置
在web.xml文件中配置:
<!--注册servlet-->
<servlet>
<!--servlet的名称-->
<servlet-name>helloServlet</servlet-name>
<!--servlet的完整类名-->
<servlet-class>com.java.model.helloServlet</servlet-class>
</servlet>
<!--servlet映射-->
<servlet-mapping>
<!--servlet的名称-->
<servlet-name>helloServlet</servlet-name>
<!--访问URL地址-->
<url-pattern>/hello123</url-pattern>
</servlet-mapping>
采用注解配置:
@WebServlet("/hello123")
public class helloServlet extends HttpServlet {
........
}
Servlet处理表单数据
下面就用一个小例子来说明,主要功能为:helloServlet类处理login.jsp表单中的信息
helloServlet类:
package com.java.model;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created with IntelliJ IDEA.
* Created by YEN on 2016/7/10 and 13:13.
*/
//采用注解配置
@WebServlet("/hello123")
public class helloServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("................init(ServletConfig config)........");
}
@Override
public void init() throws ServletException {
super.init();
System.out.println("................init()............................");
}
//Servlet在处理客户端的请求时调用此方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// super.service(req, res);
PrintWriter pw=res.getWriter();
pw.print("hello service !");
pw.close();
System.out.println("................service............................");
System.out.println(req.getParameter("username")+"........service");
System.out.println(req.getParameter("password")+"........service");
}
//当Servlet容器移除Servlet对象时调用此方法,以释放资源
@Override
public void destroy() {
super.destroy();
System.out.println("................destroy............................");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//获取username password参数
String name=req.getParameter("username");
String pass=req.getParameter("password");
//从response中获取PrintWriter对象
PrintWriter printWriter=resp.getWriter();
printWriter.write(name+"..................."+pass);
printWriter.flush();//刷新printWriter
printWriter.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println(req.getParameter("password")+"........doPost");
}
}
login.jsp页面
<%--
Created by IntelliJ IDEA.
User: YEN
Date: 2016/7/9
Time: 16:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script>
function checkForm() {
if(document.getElementById("username").value==null || document.getElementById("username").value==""){
alert("用户名不能为空!");
return false;
}
if(document.getElementById("password").value==null || document.getElementById("password").value==""){
alert("密码不能为空!");
return false;
}
return true;
}
</script>
</head>
<body>
<form name="form1" action="<%=request.getContextPath()%>/hello123" method="get" onsubmit="return checkForm()">
username:<input type="text" name="username" id="username"> <br>
password:<input type="password" name="password" id="password"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
运行结果如下:
一:在login.jsp中输入登陆信息
二:点击登陆按钮后
三:查看IntelliJ IDEA中的运行结果
至此,一个Servlet的应用就完成了。