JSP 学习笔记

JSP 全名为Java Server Pages,中文名叫java 服务器页面,它是在传统的 HTML 页面中插入 JAVA 代码片段和 JSP 标签形成的文件。

上一篇 Servlet 中只是讲解了我们开发中为什么继承 HttpServlet,而不是 Servlet 和 GenericServlet。并且只是对 ServletConfig、ServletContext、ServletResponse、ServletRequest 四个对象所拥有的方法简单的进行了介绍,这篇文章将会接着上一篇文章进行更加详细的讲解。

首先我们需要知道在 JSP 页面上需要将 java 代码写在 <% java... %>  中间,JSP 经过服务器解析翻译其底层其实是一个 Servlet 的实现。

知道了如何在 JSP 页面上写 JAVA 代码,接着便是如何去写 Java 代码并且和服务器相关。首先我们需要了解 JSP 页面的九个隐含对象。

  request -- HttpServletRequest 对象

  response -- HttpServletResponse 对象

  pageContext -- 页面的上下文, pageContext 对象,从中可以获取到其他八个隐含对象吗,也可以获取到当前页面的其他信息,可以代表当前页面

  session -- 代表浏览器和服务器的一次对话,是 HttpSession 的一个对象

  application -- 代表当前 WEB 应用,是 ServletContext 对象,可以获取当前 WEB 应用的初始化参数参数

  config -- 代表当前 ServletConfig 对象

  out -- 是 JSPWriter 对象,调用 out.println() 可以把字符打印到页面, <%= %>  等于 out.print() 功能就是输出至页面(底层实现都是一样的)

  page -- 当前 JSP 对应的 Servlet 对象的引用,为 Object 对象

  exception -- 在 page 指令中声明了  isErrorPage=true  时才会用到

 我们接着上篇文章所说的 ServletContext 等对象的方法讲解,setAttribute() ,getAttribute(),那么 JSP 的隐含对象也就有这些对象所拥有有的方法,接下来我们在页面上给 request pageContext session application 四个对象设置属性,在另外一个页面和 Servlet 上获取其属性值,index.jsp 如下:

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3   <head>
 4     <title>LoginPage</title>
 5   </head>
 6   <body>
 7   <h2>PAGE1</h2>
 8     <%
 9       request.setAttribute("request", "requestValue");
10       pageContext.setAttribute("pageContext", "pageContextValue");
11       session.setAttribute("session", "sessionValue");
12       application.setAttribute("application", "applicationValue");
13     %>
14   <br><br>
15   <%= request.getAttribute("request")%>
16   <br><br>
17   <%= session.getAttribute("session")%>
18   <br><br>
19   <%= pageContext.getAttribute("pageContext")%>
20   <br><br>
21   <%= application.getAttribute("application")%>
22   <br><br>
23 <%-- 跳转至 page2 和 Servlet 获取属性 --%>
24   <a href="page2.jsp">ToPage2</a>
25   <a href="attributeServlet">ToServlet</a>
26   </body>
27 </html>

 page2.jsp 如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Page2</title>
</head>
<body>
    <h2>PAGE2</h2>
    <br><br>
    <%= request.getAttribute("request")%>
    <br><br>
    <%= session.getAttribute("session")%>
    <br><br>
    <%= pageContext.getAttribute("pageContext")%>
    <br><br>
    <%= application.getAttribute("application")%>
    <br><br>
  <a href="index.jsp">ToIndex</a>
</body>
</html>

AttributeServlet 如下

 1 package attribute.scope.test;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.HttpServlet;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import java.io.IOException;
 8 
 9 public class AttributeServlet extends HttpServlet {
10     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
11 
12     }
13 // 由于是超链接,所以是 get 请求,所以只需要覆盖 doGet 方法即可
14     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15         Object objRequest = request.getAttribute("request");
16         Object objSession = request.getSession().getAttribute("session");
17         Object objApplication = getServletContext().getAttribute("application");
18 
19         System.out.println("Application: " + objApplication);
20         System.out.println("Request: " + objRequest);
21         System.out.println("Session: " + objSession);
22     }
23 }

 运行程序后,page2.jsp 中只有 session 和 application 两个对象的值不为 null,而在 Servlet 中 也只有 session 和 application 两个对象不为空,这是因为 pageContext 对象的作用范围为当前页面,所以跳转到另外一个页面或 Servlet 便不会获取到;而 request 的作用范围为一个请求,因为点击的是超链接所以每次都是不同的请求,所以获取不到,而 session 的作用范围为一次会话,也就是浏览器打开直到关闭为一次会话,application 的作用范围为当前 WEB 应用,只要一处设置属性,在当前 WEB 应用的任何地方都可以访问到。我们称上述四个对象为域对象,其对属性的作用范围从小到大依次为 PageContext request session application

上面我们介绍了和 Attribute 相关的两个方法,接着是请求的转发和重定向,我们需要知道转发和重定向的区别:

  对于请求转发,其URL 为初次发送请求的地址,而重定向为请求响应的地址;

  request 对象在请求转发的情况下在不同的 Servlet 中是相同的request,重定向不是同一个

  请求转发只能作用于当前 WEB 应用,而请求重定向可以作用于任何资源包括网络资源

转发实现步骤  servletRequest.getRequestDispatcher("/user.jsp").forward(servletRequest, servletResponse);

  调用 HttpServletRequest 的 getRequestDispatcher() 方法获取 RequestDispatcher 对象,调用 getRequestDispatcher() 需要传入要转发的地址;

  调用 HttpServletRequest 的 forward(request, response)

  / 代表当前 WEB 应用根目录(http://localhost:8989/项目名称)

重定向的步骤 response.sendRedirect("user.jsp");

  直接调用 response(HttpServletResponse 的对象) 的 sendRedirect 方法

我们知道了请求的重定向和请求的转发之后加上我们之前所学的 request 域对象,这时候便可以实现跨页面得到 request 的属性值了。

JSP 指令之 Page 指令

  Page 指令的 session 值为可 true 或 false,指当前页面是否可用 session 隐含域对象;

  isErrorPage 可设置为 true 或 false,指定当前页面是否为错误页面,如果为 true,那么该页面就可调用 JSP 域对象 Exception,就可以使用 Exception.getMessage() ,打印错误消息。若一个页面的 isErrorPage 为 true,那么该页面不该被直接访问,只能通过请求转发访问,因为若直接访问,Exception 域对象将为 null,调用 getMessage() 方法将会有 空指针异常;

  ErrorPage 指定当前页面发生异常的时候到一个指定页面,该页面的 isErrorPage 应当为 true;

  contentType 设置页面响应类型,实际上是调用 response.setContentType(“text/html; charset=”UTF-8””) 方法,JSP 页面通常都设置为 text/html;

  charSet 指定返回的页面字符编码;pageEncoding 指定当前页面字符编码

   IsELIgnored 指定当前 JSP 页面是否可使用 EL 表达式(有关 EL 表达式后面将会讲解),通常为 true;

解决中文乱码

  1. 设置所有可设置的编码为 UTF-8,可以解决当前页面和返回页面不乱码;

  2. 若获取表单中的值并返回,且表单值为中文采用上面的方法便不会达到目地,这种情况可以采用  request.setCharacterEncoding(“UTF-8”);  并且此方法必须在获取表单值之前调用(即 request.getParameter("name"); 之前),POST 方法。

  3. 对于 GET 请求调用上面的 setCharacterEncoding(“UTF-8”); 并不会奏效,因为默认传输过程编码为 ISO-8859-1,这时候我们可以修改 Tomact 配置文件 server.xml,在 Connector 节点中加上 useBodyEncodingForURI=“true”,那么对于 GET 请求   request.setCharacterEncoding(“UTF-8”);   方法便会奏效,如下:

    <Connector port="9090" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" useBodyEncodingForURI="true"/>

加上上一篇 Servlet 博文便是我上一周的学习内容,希望有大神读完的可以给点建议,比如如何写博客,在这先谢谢了!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

muduo网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

一、Exception类封装 class Exception : public std::exception ?  #include <execinfo.h>...

26400
来自专栏扎心了老铁

springboot mybatis 事务管理

本文主要讲述springboot提供的声明式的事务管理机制。 一、一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transacti...

60270
来自专栏Java编程技术

使用数据库悲观锁实现不可重入的分布式锁

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源...

8710
来自专栏情情说

深入浅出MyBatis:「映射器」全了解

上一篇总结了MyBatis的配置,详细说明了各个配置项,其中提到了映射器,它是MyBatis最强大的工具,也是使用最多的工具。

41760
来自专栏分布式系统进阶

Influxdb的Meta data分析

Influxdb定义了一个Service:Precreator Serivec(services/precreator/service.go),实现比较简单,周...

17820
来自专栏智能大石头

实体处理模块IEntityModule

在2015年7月16日,XCode新增了实体处理模块IEntityModule,用于拦截实体对象添删改操作。 该接口参考IHttpModule设计理念,横切在实...

209100
来自专栏用户2442861的专栏

muduo 4 网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

class Exception : public std::exception

20710
来自专栏日常分享

JSP/Servlet Web 学习笔记 DayFour

  Servelt是使用Java Servlet应用程序接口及相关类和方法的Java程序。

12920
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十一天 JSP学习

JSP全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,H...

20530
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第九天 ServletContext&amp;Response&amp;request学习

Web-第九天 ServletContext&Response&request学习

20330

扫码关注云+社区

领取腾讯云代金券