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的主要功能:
Servlet特点
Servlet技术最大的优势就是可以处理客户端传来的HTTP请求,并返回一个响应。
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在处理客户端的请求时调用此方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
//当Servlet容器移除Servlet对象时调用此方法,以释放资源
public void destroy()
//用于获取Servlet对象的配置信息,返回ServletConfig对象
public ServletConfig getServletConfig()
//返回有关Servlet的信息,是纯文本格式的字符串
public String getServletInfo()
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请求的处理方法
//常用方法
public Cookie[] getCookies() //返回所有Cookie对象
public String getMethod() //返回HTTP请求类型
public String getContextPath() //返回上下文路径
public String getQueryString() //返回请求的查询字符串
public String getRequestURI() //返回主机名到请求参数之间的部分字符串
public HttpSession getSession() //返回与主机关联的HttpSession对象
//常用方法
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的应用就完成了。