Servlet与JSP之间的关系
创建controller包,在其中创建Servlet.java的类文件,代替之前的doXXX.jsp文件
JSP本质就是servlet
一.Servlet特点
特点:服务器端程序,多线程,效率高,可移植,易使用,功能强。
作用:用作控制器
运行在服务器上的Java类,封装了协议及内置对象
用Servlet代替doXXX.jsp
Servlet类:
|——HttpServlet类
|——doGET()
|——doPost()
会调用javax.servlet包,javax.servlet.http.HttpServlet包,这两个均为java扩展包。
二.Servlet类创建
在Java中,通常所说的 Servlet 是指 HttpServlet 对象,在声明一个对象为 Servlet 时,需要继承 HttpServlet 类或者实现 Servlet 接口。
HttpServlet 类是 Servlet 接口的一个实现类,继承此类后,需重写 HttpServlet 类中的方法对HTTP请求进行处理。
Servlet的两种编写方式
-
1 继承HttpServlet,重写doGet(),doPost()
-
2 实现Servlet,重写getServletConfig(),getServletInfo(),init(),destroy(),service()方法
其中:
1.调用构造方法,创建servlet对象,存放在servlet容器中
2.init() 初始化
3.service() 处理请求 ------> doGet()+doPost()
4.响应结果
5.destroy() 销毁
配置web.xml
//设置servlet名字
<servlet-name>sa</servlet-name>
//设置servlet类名
<servlet-class>com.servlet.DoReg</servlet-class>
//用于映射上面中的对外访问路径
//设置servlet的名称
<servlet-name>sa</servlet-name>
//设置servlet的请求路径
<url-pattern>/reg.do</url-pattern>
三.Servlet的生命周期(重点!!!)
Servlet是服务器端小程序,因此生命周期受web容器(也可看作是服务器)的控制。
Servlet的生命周期分:加载程序、初始化、服务、销毁、卸载5个部分。
1、由tomcat创建servlet对象
2、调用初始化init()方法 成员变量赋值等
3、执行service()方法
父类HttpServlet中
当客户端请求到达服务器后,先调用父类中的service()方法,
此方法判断客户端请求的方式是post还是get,来决定调用servlet的 doGet() 还是doPost()
4、响应结果
5、destroy()销毁 servlet容器中的servlet
Servlet的生命周期5个部分
1.加载Servlet (构造方法)
Web容器负责加载Servlet,当WEB容器启动时或第一次使用serblet时,容器会负责创建Servlet实例(需配置web.xml指定servlet的位置),成功加载后,web容器会通过映射的方式对Servlet进行实例化。
2.初始化 (init()方法)
当servlet被实例化后,容器将调用init()方法初始化这个对象。初始化包括建立数据库连接、读取源文件信息等。
如初始化失败,则此Servlet将被直接卸载(注意,不是直接销毁,而是直接卸载)。
3.处理服务 (service()方法)
当有请求提交时,servlet调用service()方法(常用的有doGet()和doPost())进行处理。在service()中,可通过ServletRequest接收客户的请求,也可通过ServletResponse响应客户信息。
4.销毁 destory()
当WEB容器关闭或检测到一个Servlet要从容器中被删除时,会自动调用destory()方法,释放实例所占用的资源。(注意:销毁servlet实例,并不是删掉了servlet实例)
5.卸载
在销毁后,该实例将等待被垃圾收集器回收,如在被回收前再次使用此servlet,会重新用init()方法初始化。
需要提醒的是:
在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次。但如果一个servlet长时间不使用,也会被容器自动销毁,而如果需要再次使用时会重新进行初始化的操作,即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。
四.Servlet API常用接口和类
(一)Servlet接口
对请求进行处理。
任何一个Servlet对象都要直接或间接地实现javax.servlet.Servlet接口。
-
init(ServletConfig config)
//Servlet实例化后,Servlet容器调用该方法来完成初始化工作 -
service(ServletRequest request, ServletResponse response)
//用于处理客户端的请求 -
distroy()
//当Servlet对象从Servlet容器中移除时,调用该方法,释放资源 -
getServletConfig()
//用于获取Servlet对象的配置信息,返回ServletConfig对象 -
getServletInfo()
//返回有关Servlet的信息,它是纯文本格式字符串,如作者、版本等
(二)ServletConfig接口
位于javax.servlet包中,它封装了Servlet的配置信息。
-
getInitParameter(String name)
//返回String类型名称为name的初始化参数值 -
getInitParameterNames()
//获得所有初始化参数名的枚举集合 -
getServletContext()
//用于获取Servlet上下文对象 -
getServletName()
//返回Servlet对象的实例名
(三)HttpServletRequest接口
-
getContextPath()
//返回请求的上下文路径,以"/"开始 -
getCookies() -
getMethod() -
getQueryString() -
getRequestURI() -
getRequestURL() -
getServletPath() -
getSession()
HttpSession session = request.getSession();
session.setAttribute(name, value);
(四)HttpServletResponse接口
-
addCookie(Cookie cookie) -
sendError(int sc) -
sendError(int sc, String msg) -
sendRedirect(String location)
(五)GenericServlet类
(六)HttpServlet类
-
service()//服务 -
doGet()//get提交 -
doPost()//post提交 -
doPut() -
doDelete()
-doHead()
-
doTrace() -
doOption()
Servlet跳转 客户端跳转(重定向): request.sendRedirect(url);
服务器端跳转(转发:) request.getRequestDispatcher(url)
forward(request, response);
例子:
AddDeptServlet.java
package cn.qf.emp.controller;
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;
import cn.qf.emp.pojo.Dept;
import cn.qf.emp.service.DeptService;
/**
* Servlet implementation class AddDeptServlet
*/
@WebServlet("/ads")
public class AddDeptServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AddDeptServlet() {
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());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
//获取表单数据
Dept dept=new Dept();
dept.setDeptno(request.getParameter("dno"));
dept.setDname(request.getParameter("dname"));
dept.setLoc(request.getParameter("loc"));
//调用业务逻辑
DeptService ds=new DeptService();
String ret=ds.addDept(dept);
//分发转向
if(ret.equals("添加成功")){
//不能在servlet中直接使用session,通过request对象获取
//HttpSession session=request.getSession();
response.sendRedirect("index.jsp");
}else{
response.sendRedirect("AddDept.jsp");
}
}
}
AddDept.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加部门</title>
</head>
<body>
<form method="post" action="ads">
<p><input type="text" name="dno"/></p>
<p><input type="text" name="dname"/></p>
<p><input type="text" name="loc"/></p>
<p><input type="submit" value="添加部门"/></p>
<p><input type="reset" value="重置"/></p>
</form>
</body>
</html>
3294

被折叠的 条评论
为什么被折叠?



