什么是Servlet
Servlet是使用Java语言编写的运行在服务器端的程序,它在JSP 诞生之前就存在。
Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序。Java语言能够实现的功能,Servlet基本上都能实现(除了图形界面外)。
Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。
Servlet接口及其实现类
针对Servlet技术的开发,SUN公司提供了一系列接口和类,其中最重要的接口是javax.servlet.Servlet。在Servlet接口中定义了5个抽象方法:
针对Servlet的接口,SUN公司提供了两个默认的接口实现类:GenericServlet和HttpServlet。
GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,它并没有实现HTTP请求处理。
HttpServlet是GenericServlet的子类,它继承了GenericServlet的所有方法,并且为HTTP请求中的POST、GET等类型提供了具体的操作方法。
通常情况下,编写的Servlet类都继承自HttpServlet,在开发中使用的具体的Servlet对象就是HttpServlet对象。HttpServlet的常用方法及其说明:
通过修改doGet()方法在网页中输出Hello world!
HelloServlet.java:
package cn.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;
/**
* Servlet implementation class HelloServlet
*/
@WebServlet("/HelloServlet") //url地址,“/”表示项目的根目录 Servlet需要重启服务器(修改xml文件的时候才重启)
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1>Hello world!</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
接收表单内容并输出
form.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- <form action="/Servlet/FormServlet" method="post"> --> <!-- 绝对路径 -->
<form action="../FormServlet" method="post"> <!-- 相对路径 -->
姓名:<input type="text" name="name"/> <br>
爱好:<input type="text" name="hobby"/> <br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
FormServlet.java:
package cn.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;
/**
* Servlet implementation class FormServlet
*/
@WebServlet("/FormServlet")
public class FormServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FormServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String hobby = request.getParameter("hobby");
PrintWriter out = response.getWriter();
out.print("姓名:"+name+"</br>"+"爱好:"+hobby);
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
注意上面form表单中action中的地址路径,而且要注意doGet方法中内容的修改
Servlet 的生命周期
按照功能的不同,大致可以将Servlet的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。
在Servlet的整个生命周期内
init()方法只被调用一次
Service()方法会被调用多次
Destroy()方法也只被调用一次。
代码进行表达:
MyServlet.java
package cn.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class MyServlet
*/
@WebServlet("/MyServlet") //有注解,修改了xml配置文件,需要重启服务器
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init method is called!");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destory method is called!");
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service method is called!");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("doGet method is called!");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
如果将下面的代码删除的话:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service method is called!");
}
多学一招: 自动加载Servlet程序
在实际开发时,有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。例如,当启动一个Web项目时,首先需要对数据库信息进行初始化。这时,只需要使用web.xml文件中<load-on-startup>元素,将初始化数据库的Servlet配置为随着web应用启动而启动的Servlet即可。
在<load-on-startup>元素中,设置的值必须是一个整数。如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正整数或0,Servlet容器将在Web应用启动时加载并初始化Servlet,并且<load-on-startup>的值越小,它对应的Servlet就越先被加载。
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>cn.demo.servletdemo.HelloWorldServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
取得其他内置对象
ServletConfig
Config对象即ServletConfig接口的实例,通过它可以读取web.xml中配置的初始化参数。
ServletContext
application对象是ServletContext接口的实例,表示Servlet上下文。
取得session对象
HttpRequest对象有两种形式的getSession方法调用:
(1)request.getSession()
检测当前有session存在,如果不存在则创建一个,如果存在就返回当前的
(2)request.getSession(boolean isNew)
参数为true时,若存在会话则返回该会话,否则新建一个会话。
参数为false时,若存在会话则返回该会话,否则应该返回一个NULL
getSession()相当于getSession(true)
输出真实路径
TextServlet.java:
package cn.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TextServlet
*/
@WebServlet("/TextServlet")
public class TextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TextServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
ServletContext app = this.getServletContext();
PrintWriter out = response.getWriter();
out.print("真实路径="+app.getRealPath("/"));
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
取得session对象,获得内容
SessionServlet.java
package cn.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionServlet
*/
@WebServlet("/SessionServlet")
public class SessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SessionServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println("session id ------------>"+session.getId());
session.setAttribute("username", "刘德华");
System.out.println("username属性de内容是:"+session.getAttribute("username"));
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Servlet跳转
客户端跳转
response.sendRedirect(“url”)
服务器端跳转
request.getRequestDispatcher(“url”).forward(requset,reponse);
JSP开发模型
JSP Model2架构模型采用JSP+Servlet+ JavaBean的技术,此技术将原本JSP页面中的流程控制代码提取出来,封装到Servlet中,从而实现了整个程序页面显示、流程控制和业务逻辑的分离。JSP Model2的工作原理如下图所示。
MVC设计模式
MVC设计模式将软件程序分为三个核心模块:模型(Model)、视图(View)和控制器(Controller) ,这三个模块的作用如下所示。
使用mvc模式获取表单信息,并实现跳转登陆页面功能
a1_form_zhuce_.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="RegisterServlet" method="post">
<h3>用户注册表单</h3>
<p>姓名:<input type="text" size="20" name="uname"></p>
<p>密码:<input type="password" name="pwd"></p>
<p>
性别:
男<input type="radio" name="sex" value="男" checked="checked">
女<input type="radio" name="sex" value="女">
</p>
<p>
爱好:
篮球<input type="checkbox" name="duo" value="篮球">
足球<input type="checkbox" name="duo" value="足球">
手球<input type="checkbox" name="duo" value="手球">
爬山<input type="checkbox" name="duo" value="爬山">
游泳<input type="checkbox" name="duo" value="游泳">
</p>
<p>E-maile<input type="email" name="email"></p>
<p>
<input type="submit" value="提交">
<input type="reset" value="重置">
<input type="button" value="普通">
</p>
</form>
</body>
</html>
RegisterServlet.java
package cn.mvc.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;
import cn.dao.dao.UserDaoImplete;
import cn.dao.vo.User;
/**
* Servlet implementation class RegisterServlet
*/
@WebServlet("/mvc/RegisterServlet")
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RegisterServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取表单输入的数据
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("pwd");
String gender = request.getParameter("sex");
String message = "" ;
String []favour = request.getParameterValues("duo");
for(int i = 0 ; i < favour.length ; i++){
message = message + favour[i]+",";
}
String email = request.getParameter("email");
//2、封装到User里面
User user = new User(0,name,pwd,gender,message,email);
UserDaoImplete udi = new UserDaoImplete();
boolean flag = udi.add(user);
//PrintWriter out = response.getWriter();
if(flag){
// 客户端跳转
// response.sendRedirect("a1_denglu.jsp");
// out.print("<h1>注册成功!2秒后自动跳转到登陆页面,如果没有跳转,请点击<a href='a1_denglu.jsp'>登陆</a></h1>");
//服务器端跳转
request.getRequestDispatcher("a1_denglu.jsp").forward(request, response);
}else {
response.sendRedirect("a1_form_zhuce_.jsp");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}