- 参考:
- 什么是Servlet
- Servlet是在服务器上运行的小程序,一个Servlet就是一个java类
- Tomcat容器
- Engine引擎容器
- Host主机容器
- Context上下文容器
- Wrapper包装器
- 这四个容器之间是父子关系,Engine包含Host,Host包含Context,Context包含Wrapper。
- 在web项目中的一个Servlet类对应一个Wrapper,多个Servlet就对应多个Wrapper,当有多个Wrapper的时候就需要一个容器来管理这些Wrapper了,这就是Context容器了,Context容器对应一个工程,所以我们新部署一个工程到Tomcat中就会新创建一个Context容器。
- 如何编写一个Servlet
- Servlet体系结构
- Servlet接口
- GenericServlet抽象类
- HttpServlet抽象类
- 自定义Servlet
- Servlet生命周期
- 初始化:调用init()方法(注:在这之前会先判断Servlet实例是否存在,如果不存在会先加载类并创建实例)
- 服务:调用service()方法
- 销毁:调用destroy()方法
- Servlet的核心类有哪些?
// 1
ServletContext:容器,放置全局变量
setAtribute()
getAttribute()
// 2
ServletConfig:一个servlet的配置
getInitParameter(”名称”)
// 3
HttpServletRequest:封装的所有的请求
getParameterValue(”名称”)
getParameterValues(”称”)
getSession();
getAttribute(” 名称”);
getRequestDispatch(”a.jsp”).forward(request,response)
// 4
HttpServletResponse:响应
getOut();
sendRedirect(””)
//5
HttpSession:一个用户多个页面共享同一变量
setAttribute(””,””)
- Servlet与JSP
- Servlet 通常使用字符串拼接的方式动态生成 html,大量的 html 内容使代码难以维护、可读性差。
- JSP 是基于 Servlet API 的,所以拥有 Servlet 拥有的一系列好处,可以实现各种功能,同时可以很方便地编写或修改网页,不用面对大量的 println 语句,但是,什么事情都要把握一个度,在 html 中混入大量、复杂的业务逻辑也是不可取的。
- 一种双剑合璧、扬长避短的方法是把 Servlet 当成 Controller 层,用于处理浏览器请求,并调用核心业务逻辑(Model)。而 JSP 则用作 View 层,负责动态地把处理结果输出到 html 中去。
- Servlet的运行过程:
- Web服务器先检查Servlet实例是否存在,如果不存在则加载Servlet类并创建Servlet实例对象
- 调用Servlet实例对象的init()方法
- 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
- WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
- *.jsp 的执行过程:
- *.jsp 被转译为 *.java(该类继承自 HttpJspBase,而 HttpJspBase 继承自 HttpServlet)
- *.java 被编译成 *.class
- 执行 *.class,生成 html
- 通过 HTTP 协议把 html 响应返回给浏览器
- 如何实现Servlet或JSP的单线程模式?
- 对于JSP,可以通过page指令进行设置:<%@page isThreadSafe=”false”%>
- 对于Servlet,可以让自定义的Servlet实现SingleThreadModel接口(标记接口,接口现已过时)。
说明:如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
- Servlet之ServletConfig对象、ServletContext对象、request对象、response对象
- ServletConfig对象:
// 获取方式
getServletConfig();
// 功能
// getServletName(); //获取servlet的名称,也就是我们在web.xml中配置的servlet-name
// getServletContext(); //获取ServletContext对象
// getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
// getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值
- ServletContext对象 :
// 获取方式
getServletContext();
// 功能
// tomcat为每个web项目都创建一个ServletContext实例,tomcat在启动时创建,服务器关闭时销毁
// 在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等,
// 通俗点讲,就是一个web项目,就存在一个ServletContext实例,每个Servlet读可以访问到它。
- request对象:
// request就是将请求文本封装而成的对象,所以通过request能获得请求文本中的所有内容,请求头、请求体、请求行 。
// 请求转发
// 特点:浏览器中url不会改变,也就是浏览器不知道服务器做了什么,是服务器帮我们跳转页面的,并且在转发后的页面,能够继续使用原先的request,因为是原先的request,所以request域中的属性都可以继续获取到。
request.getRequestDispatcher(String path).forward(request,response);
- response对象 :
// 重定向(页面跳转)
// 方式一:手动方案
response.setStatus(302); //状态码302就代表重定向
response.setHeader("location","http://www.baidu.com");
// 方式二:使用封装好的方法
response.sendRedirect("http://www.baidu.com");
特点:服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,也浏览器的地址栏中url会变,是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。
// 注:response.sendRedirect(path)的用法;
// 第一种:使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01
response.sendRedirect("/test01/MyServlet01");
// 第二种:没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。
response.sendRedirect("MyServlet01");
重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。就是这样来区别。
- JSP之3个指令、6个动作、9个内置对象和4大作用域
- JSP九大内置对象
- Request: request表示HttpServletRequest对象。取客户端表单域信息及cookie, header, 和session
- response: response表示HttpServletResponse对象,对客户端的响应返回文本、写cookies。
- out: out 向客户端打印html文本.
- pageContext :当前jsp页面的上下文环境,可以得到session、request、application等内置对象,在自定义标签中使用的很多。
- session: session表示一个请求的javax.servlet.http.HttpSession对象。Session一个用户多个页面共享同一变量。
- application: applicaton 表示一个javax.servle.ServletContext对象。存放容器级的变量。
- config: config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
- page: page表示从该页面产生的一个servlet实例
- exception:异常,当iserrorpage=true
- JSP中动态include与静态include的区别?
<%-- 静态包含 --%>
<%@ include file="..." %>
<%-- 动态包含 --%>
<jsp:include page="...">
<jsp:param name="..." value="..." />
</jsp:include>
// 静态 included
// 在将jsp生成servlet类前将两个文件和在一起,生成一个java类,一起运行的。所以是一家子,当中的变量名不能重名。
<%@ include file="included.htm" %>
// 动态 included
// 在运行时调用另一个页面,是两个类,是一个调用关系,在运行时动态的调用,不是一家子,可以重复变量。
// 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
<jsp:include page="included.jsp" flush="true" />
- JSP页面中两种跳转方式分别是什么?有什么区别?
// forward跳转:
// 服务器端跳转,地址栏不改变。
// 执行到跳转语句后马上执行跳转,之后的代码不再执行(跳转之前一定要释放全部资源)。
// request设置的属性在跳转后的页面仍然可以使用。
<jsp:forward page ="跳转页面地址">
// response跳转:
// 客户端跳转,地址栏改变。
// 所有代码执行完毕后跳转。
// 跳转后页面不能使用上一个页面的request。
// 使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。
response.sendRedirect("跳转页面地址");
- 在JSP中如何读取客户端的请求,如何确定某个Jsp文件的真实路径?
// 获取请求参数
Request.getparameter(“”)
// 获取某个jsp文件的路径
<%=application.getRealPath("aa.jsp") %>