servlet 概念
- 运行在服务的小程序接口,定义了可以在服务器运行的java类的接口,也就是用于服务器交互式的Java程序
浏览器 服务器
Servlet(Servlet Applet),全称Java Servlet,是用Java编写的服务器端程序。Servlet运行于支持Java的应用服务器中。
执行原理
比如地址 http://localhost:8080/chen/hello
主机名: http://localhost:8080 定位到服务器
项目名: chen 定位到服务上的程序
请求的资源名 hello 定位到程序的资源
url:端口/资源名称 反射全类名的字节码加载进内存 调用service方法
- 服务器接受到请求解析url 获取对应资源的路径
- 查找web.xml文件,是否有对应的标签
- 查找到对应的全类名
- 服务器例如 tomcat 会加载Java程序的字节码文件,创建对象
- 调用对象的方法
使用
基于web.xml 配置
- 创建javaEE项目
- 定义类实现Servlet接口
- 实现Servlet中的抽象方法
- 配置servlet 类名对应路径
package com.cloud.note.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<!-- web.xml配置 -->
<servlet>
<!-- servlet的name-->
<servlet-name>demo</servlet-name>
<servlet-class>com.cloud.note.servlet.ServletDemo</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<!-- servlet的响应的路径资源-->
<url-pattern>/demo</url-pattern>
</servlet-mapping>
servlet3.0 开始支持注解配置 Jdk 6
- 创建servlet项目 servlet3.0版本
- 定义类实现Servlet接口
- 实现Servlet中的抽象方法
- 使用@ebservlet注解配置url @WebServlet(“资源路径”)
package com.colin.servlet;
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响应的url
@WebServlet("/bookDelete")
public class BookDeleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
基于注解和web.xml配置各有优势吧
XML配置的特点:
- 修改web.xml配置文件不需要工程进行修改和重新编译
- 直观的了解项目所有的Servlet ,和对应的url
- 配置文件庞大,开发效率低一些,简单说方便总览,但不方便具体
注解配置的特点:
- 提高开发效率,可以只专注于每个Servlet
- 简化配置文件,减少了web.xml修改的工作量
- 修改注解需要编译工程
- 总览不方便
总之就是互为缺点,web.xml相当于程序的清单一样,方便总览,但也要增加维护(保证清单的正确性,及时更新)
Servlet的生命周期
- Servlet的创建 init() 只执行一次,创建时机可以设置 :
- 当 为负数表示第一次访问时创建
- 当 大于等于0表示服务器启动时创建
- 单例模式,只存在一个 init方法只执行一次
- 多个用户同时访问时可能存在线程安全问题 不要在servlet定义成员变量,如果定义不能进行修改
- 执行 service() 每次访问servlet时执行一次,获得请求时执行的方法
- 销毁 destroy() 只执行一次 在Servlet被销毁时执行释放资源
时机:正常关闭服务器
package com.itheima.controller;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* servlet 生命周期
* @author newChenyingtao
*
*/
public class UserServlet implements Servlet {
@Override
public void destroy() {
System.out.println("销毁");
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("创建servlet");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("服务中");
}
}
资源跳转方式: 转发和重定向
getRequestDispatcher()
reponse.sendRedirect()
forward方式 转发 请求体
发生在服务器上,服务器将请求转法到程序的其他Servlet入口处,跳转的路径是相对路径,也即是forward方式只能跳转到本web应用中的页面上,因为发生在服务器上,所以跳转后浏览器地址栏不会变化
request.getRequestDispatcher("/路径(可以是jsp路径也可以是servlet)") .forward(request, response);
request.getRequestDispatcher("/2.jsp)") .forward(request, response);
request.getRequestDispatcher("/servlet/HomeServlet)") .forward(request, response);
使用这种方式跳转,传值可以使用三种方式:url, request, session
sendRedirect 重定向
简单的重定向方法
response.sendRedirect("url");
response.sendRedirect()是重新定向,前后页面不是一个request,并且而这个是在浏览器端运行的。
页面的路径是相对路径response.sendRedirect("/a.jsp");
或者跳转到任何页面,不一定局限于本web应用中,如:response.sendRedirect("www.baidu.com");
跳转后浏览器地址栏变化。
参数附带 url、session 中,所以该方式只适用于无传值跳转
重定向特点:
1. 地址发生变化
2. 可以访问其他站点
3. 两次请求
转发特点:
1. 转发地址栏不变
2. 当前服务器下资源
3. 一次请求
今天先到这里,以后再补充。