JSP只是负责显示的页面,最好不要进行接收请求,调用JavaBean去处理请求的工作,为了让JSP只专注于显示就要引入Servlet将显示与请求、处理请求的工作分开
各种网页系统组成:
JSP(Java Server Pages):显示数据
Servlet:接收请求,调用JavaBean去处理请求
JavaBean:封装数据;业务逻辑
Servlet做了什么?
- 本身不做任何业务处理
- 只是接收请求并决定调用哪个JavaBean去处理请求
- 确定用哪个页面来显示处理返回的数据
Servlet是什么?
- Server+Applet ,是一种服务器端的Java应用程序
- 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet
- Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应
- Servlet可以动态生成HTML内容对客户端进行响应
Servlet:
- Java程序
- 运行在服务器端
- 需要web容器的支持(想运行Servlet要走Tomcat)
- 使用了ServletAPI
- 本身不做任何业务处理,中间调度作用
Servlet与JSP的关系:
ServletAPI:
1. javax.servlet.Servlet接口:
所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集,定义了所有Servlet需要实现的方法
方法名称 | 功能描述 |
void init (ServletConfig config) | 由Servlet容器调用,用于完成Servlet对象在处理客户请求前的初始化工作 |
void service ( ServletRequest req, ServletResponse res) | 由Servlet容器调用,用来处理客户端的请求 |
void destroy ( ) | 由Servlet容器调用,释放Servlet对象所使用的资源 |
ServletConfig getServletConfig ( ) | 返回ServletConfig对象,该对象包含此 Servlet 的初始化和启动参数。 返回的ServletConfig对象是传递给init()方法的对象 |
String getServletInfo ( ) | 返回有关Servlet 的信息,比如作者、版本和版权。 返回的字符串是纯文本,而不是任何种类的标记(如 HTML、XML等) |
2. javax.servlet.ServletConfig接口
在Servlet初始化过程中获取配置信息,一个Servlet只有一个ServletConfig对象
方法名称 | 功能描述 |
String getInitParameter (String name) | 获取web.xml中设置的以name命名的初始化参数值 |
ServletContext getServletContext( ) | 返回Servlet的上下文对象引用 |
3. javax.servlet.ServletContext接口
获取Web应用上下文,与Servlet容器进行通信
方法名称 | 功能描述 |
String getInitParameter (String name) | 获取名为name的系统范围的初始化参数值,系统范围的初始化参数可在部署描述符中使用<context-param>元素定义 |
void setAttribute (String name, Object object ) | 设置名称为name的属性 |
Object getAttribute (String name) | 获取名称为name的属性 |
String getRealPath (String path) | 返回参数所代表目录的真实路径 |
void log (String message) | 记录一般日志信息 |
4. javax.servlet.GenericServlet类
是Servlet的通用版本,是一种与协议无关的Servlet,提供了Servlet与ServletConfig接口方法的默认实现(service( )方法除外)
方法名称 | 功能描述 |
void init (ServletConfig config ) | 对Servlet接口中init()方法的实现,对ServletConfig实例进行了保存。此方法还有一个无参的重载方法,可用于子类中重写 |
String getInitParameter (String name ) | 返回web.xml中名称为name的初始化参数的值 |
ServletContext getServletContext ( ) | 返回ServletContext对象的引用 |
5. javax.servlet.http.HttpServlet抽象类
在GenericServlet基础上扩展的基于Http协议的Servlet继承自,GenericServlet处理HTTP协议的请求和响应
init ( );service ( );doGet ( );doPost ( );destroy ( )。
方法名称 | 功能描述 |
void service (ServletRequest req, ServletResponse res) | 对GenericServlet类中service()方法的实现,将请求分发给void service (HttpServletRequest req, HttpServletResponse res ) |
void service (HttpServletRequest req, HttpServletResponse res ) | 接收HTTP 请求,并将它们分发给此类中定义的doXXX( )方法 |
void doXXX (HttpServletRequest req,HttpServletResponse res ) | 根据请求方式的不同分别调用的相应处理方法,如doGet()、doPost()等 |
请求、响应相关接口:
1. ServletRequest接口
获取客户端请求的数据
方法名称 | 功能描述 |
Object getAttribute (String name) | 获取名称为name的属性值 |
void setAttribute (String name,Object object) | 在请求中保存名称为name的属性 |
void removeAttribute (String name) | 清除请求中名字为name的属性 |
String getCharacterEncoding ( ) | 返回请求体所使用的字符编码 |
void setCharacterEncoding (String charset) | 设置请求体的字符编码 |
String getParameter (String name) | 返回指定请求参数的值 |
String[ ] getParameterValues (String name) | 返回指定请求参数的全部值 |
RequestDispatcher getRequestDispatcher(String path ) | 返回指向指定路径的请求分发对象 |
2. HttpServletRequest接口
除了继承ServletRequest接口中的方法,还增加了一些用于读取HTTP请求信息的方法
方法名称 | 功能描述 |
String getContextPath( ) | 返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分 |
Cookie[ ] getCookies( ) | 返回客户端在此次请求中发送的所有cookie对象 |
HttpSession getSession( ) | 返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session |
String getMethod( ) | 返回此次请求所使用的HTTP方法的名字,如GET、POST |
String getHeader(String name) | 返回指定的请求头信息 |
3. ServletResponse接口
设置响应参数和向客户端发送响应数据
方法名称 | 功能描述 |
PrintWriter getWriter ( ) | 返回PrintWriter对象,用于向客户端发送文本 |
String getCharacterEncoding ( ) | 返回在响应中发送的正文所使用的字符编码 |
void setCharacterEncoding(String charset) | 设置响应的字符编码 |
void setContentType (String type) | 设置发送到客户端的响应的内容类型,此时响应的状态属于尚未提交 |
4. HttpServletResponse接口
除了继承ServletResponse接口中的方法,还增加了适用于HTTP响应的新方法
方法名称 | 功能描述 |
void addCookie(Cookie cookie) | 增加一个cookie到响应中,这个方法可多次调用,设置多个cookie |
void addHeader (String name,String value) | 将一个名称为name,值为value的响应报头添加到响应中 |
void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
void encodeURL(String url) | 使用session ID对用于重定向的URL进行编码 |
一个Servlet从生到死的一个过程(Servlet的生命周期)
public void init() throws ServletException {
System.out.println("初始化Servlet。。。。。。");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("进入doGet()。。。。。。");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("进入doPost()。。。。。。");
}
public void destroy() {
System.out.println("Servlet销毁。。。。。。");
}
实例化
当Servlet容器启动或者容器检测到客户端请求时,Servlet 容器创建 Servlet 的实例
初始化
实例化后,该容器调用 init ( ServletConfig ) 方法
服务
得到客户端Servlet请求,并做出处理时,则容器调用 service() 方法
销毁
当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候,销毁实例之前调用 destroy() 方法
第一个Servlet:
Servlet中主要方法:
1. init():Servlet的初始化方法,仅仅会执行一次
2. service():处理请求和生成响应
3. destroy():在服务器停止并且程字中的Servlet对象不再使用的时候调用,只执行一次
4. ServletRequest
封装客户的请求信息
作用相当于JSP内置对象request
5. ServletResponse
创建响应信息,将处理结果返回给客户端
作用相当于JSP内置对象response
6. ServletConfig:
包含了servlet的初始化参数信息
获取Servlet初始化参数:
Servlet初始化参数配置:
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>demo.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>initParam</param-name>
<param-value>Hello Servlet</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
获取初始化参数:
public void doGet ( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
System.out.println("处理请求时,doGet()方法被调用。");
String initParam = getInitParameter( "initParam" );
System.out.println(initParam);
Servlet路径跳转问题:
HttpServletResponse 重定向 Response.sendRedirect()
http://localhost:8080/ news/servlet/AddServlet.jsp
1. 相对路径
Response.sendRedirect("newsDetailList.jsp");
http://localhost:8080/ news/servlet/newDetailList.jsp
就是相对当前的servlet路径跳
2. 绝对路径
Response.sendRedirect("/news/jsp/admin/newsDetailList.jsp");
http://localhost:8080/ news/jsp/admin/newDetailList.jsp
从根路径开始寻找,根据web应用本身来加上应用
HttpServletRequest 转发 request.getRequestDispatcher().forward()
http://localhost:8080/ news/servlet/AddServlet.jsp
1. 相对路径
request.getRequestDispatcher("newsDetailList.jsp").forward(……)
http://localhost:8080/ news/servlet/newDetailList.jsp
就是相对当前的servlet路径跳
2. 绝对路径
request.getRequestDispatcher("/jsp/admin/newsDetailList.jsp").forward(……)
http://localhost:8080/news/jsp/admin /newDetailList.jsp
从根路径开始寻找,根据web本身来加上news路径之后再加上路径