Servlet_JSP
Servlet乱码问题Servlet 的细节Servlet 处理请求的常见过程Servlet 生命周期loadOnStartupServletContextJSPEL表达式、JSTL标签库JSP 处理请求的常见过程Servlet + JSPServlet + JSP 处理请求的常见过程转发 (forward)转发链条重定向 (redirect)转发 vs 重定向JSP 九大内置对象Java 从 0 到架构师目录:【Java从0到架构师】学习记录
码云代码:/szluyu99/mj_java/tree/master
Servlet
对应代码:/szluyu99/mj_java/blob/master/02_crm/src/com/mj/servlet/LoginServlet.java
Servlet 是 Server Applet 的简称,译为“小型的服务程序”,用于响应客户端的请求
一般的使用要素:
继承javax.servlet.http.HttpServlet,实现 doGet、doPost 或 service 方法通过request对象获取客户端的请求数据
request.getParameter()
通过response对象给客户端返回响应
response.getWriter().write()
通过注解@WebService
设置 Servlet 对应的请求路径
乱码问题
客户端的请求数据乱码
request.setCharacterEncoding("UTF-8");
服务器的响应数据乱码
response.setContentType("text/plain;charset=UTF-8");
"text/plain"
是数据的 MIMEType,根据实际情况而定更多的 MIMEType 可以参考TOMCAT_HOME/conf/web.xml
Servlet 的细节
通过 response 拿到的输出流对象(比如 getwriter),不需要程序员调用 close 去关闭
默认情况下,一个 Servlet 类,只会被服务器创建一个实例对象,而且是在第一次处理客户端请求才创建实例
注意:Servlet 并没有设计成单例模式!!!建议:不要在 Servlet 中定义可写(writable)的成员变量,会引发线程安全问题
HTTP 请求的默认端口号是 80,所以,如果 Tomcat 服务器的端口号设置为 80,那么:
localhost/path
等价于localhost:80/path
Servlet 处理请求的常见过程
如果要返回一个网页给客户端,会存在大量可读性差、难以维护的字符串拼接代码
比如下面这种代码:
Servlet 生命周期
Servlet 有init、destory生命周期方法
Servlet 可以通过注解、XML 方式使用
loadOnStartup
可以使用 loadOnStartup 属性设置 Servlet 的创建时机
负数:首次访问 Servlet 时,才会创建 Servlet非负数:项目部署到 Web 容器中时就会创建 Servlet,数值越小,越先创建默认值是 -1
ServletContext
一个 ServletContext 对象就代表一个 Web 应用,可以用来与 Web 容器(Tomcat)通信
获取 ServletContext:
request.getServletContext()
servlet.getServletContext()
常用方法:
getMIMEType
setAttribute
\qetAttribute
\removeAttribute
getRealPath
JSP
JSP 是 Java Server Pages的简称,是一种动态网页技术标准
常用指令:
<%@ page %>
:配置当前页面信息<%@ include %>
:包含其他页面<%@ taglib %>
:导入标签库
输出:<%= 需要输出的内容 %>
,等价于out.print(需要输出的内容)
嵌入 Java 代码:<% Java代码 %>
声明:<%! 声明成员变量、方法 %>
注释:<%-- 注释内容 -->
,HTML、CSS、JS 注释照常使用
EL表达式、JSTL标签库
EL 是 Expression Language 的简称
${obj.property}
、${obj["property"]}
、${obj[propertyVar]}
empty
、not empty
JSTL 是 JSP Standard Tag Library 的简称,译为 “JSP标准标签库”
JSTL 由 Apache 的 Jakarta 小组维护
EL表达式、JSTL标签库都可以简化 JSP 代码
下载使用 JSTL 核心标签库
下载地址:/download-taglibs.cgi
如果使用其核心标签库,只需要下载 2 个 jar 包即可
taglibs-standard-impl-1.2.5. jar、taglibs-standard-spec-1.2.5. jar
使用方法:
将 jar 包加入到WEB-INF/lib中,并且右击选择 “Add as Library”使用 taglib 指令导入 JSTL 核心标签库
<%@ taglib prefix="c" uri="/jsp/jstl/core" %>
常用标签:
<c:if test="条件">
<c:forEach items="集合" var="元素" varStatus="循环相关的信息">
<c:choose>
、<c:when test="条件">
、<c:otherwise>
JSP 处理请求的常见过程
明显的缺点:
Java 代码 和 HTML 代码 混合在一起,导致可读性差,难以维护整个 JSP 文件基本得由 Java 后台工程师来完成,前端工程师根本无非维护
在很久以前,有些公司是需要前端后台一起开发 JSP,现在流行前后端分离
Servlet + JSP
项目代码:/szluyu99/mj_java/tree/master/03_crm
Servlet + JSP 处理请求的常见过程
MVC 开发模式:
M (Model):数据V (View):页面展示 (JSP)C (Controller):控制器 (Servlet)
转发 (forward)
在同一个 Context 中进行请求转发:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取客户数据List<Customer> customers = Data.getCustomers();// 将客户数据存储到request中request.setAttribute("customers", customers);// 转发到list.jsp页面进行数据展示request.getRequestDispatcher("/page/list.jsp").forward(request, response);}
转发链条
在同一次请求中,可以转发多次,形成一个转发链条
在一个转发链条上可以通过request.setAttribute
、request.getArrribute
来共享数据每一次转发都会创建一个新的 request 对象,用成员变量request指向前一个 request 对象
在转发链条上,所有的 attribute 都存储在头部的Request对象中
重定向 (redirect)
重定向:服务器通知客户端重新发送请求到新的任意 URL 地址
以下两种写法等价:
response.sendRedirect("/crm/list");
// 重定向response.setStatus(302); // 状态码: 302response.setHeader("Location", "/crm/list"); // 响应头Location: /crm/list
转发 vs 重定向
转发:
request.getRequestDispatcher("/路径").forward(request, response)
只能转发到同一个 Context 下,路径中不用包含 ContextPath客户端只发了一次请求浏览器地址栏的 URL不会发生变化转发的操作只由服务器完成
重定向:
// 重定向response.sendRedirect("/路径")
可以重定向到任意 URL,如果重定向到同一个 Context 下,路径中需要包含 ContextPath客户端发了两次请求浏览器地址栏的 URL会发生变化重定向的操作由服务器+客户端配合完成
JSP 九大内置对象
4个域对象:pageContext、request、session、application
共享范围从左至右,逐渐增大
利用 EL 表达式从 JSP 域对象中获取数据