(JavaEE-07)JSP.md

#JSP JSP全称是Java Server Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态Web资源的技术。 JSP的编写就像编写HTML一样简单,但是与HTML不同的是,在JSP中,可以编写Java代码,并且允许使用request、response等web开发常用对象,实现与浏览器的交互。

demo:在JSP中输出当前时间

###JSP调用和运行原理

  • 浏览器在访问 jsp 页面时,Web服务器是如何调用并执行一个 jsp 页面呢?
    • 当你访问web服务器中的JavaWeb应用时,如果访问的不是一个Servlet,那么都会访问一个默认的Servlet,由这个默认的Servlet来定位资源。当服务器发现你请求是一个JSP时,web容器会把 jsp 翻译成一个 Servlet,然后运行这个Servlet,再将结果返回给客户端。
    • 翻译 jsp 的过程是由Tomcat来完成的,生成的 Servlet源文件会保存在 Tomcat服务器的 work 文件夹中。
    • 查看翻译后的Servlet的源码就会发现,这个类的父类继承了HttpServlet
    • 对于请求的处理,查看翻译后的Servlet源码(service方法)就会发现,在service方法中,输出了我们定义的html代码,并且Java代码也在这里运行。
    • 在运行 service 方法时,该方法内部定义了很多局部变量,根据生成 Java 代码的位置就可以得知,这些变量和对象,可以直接在 Java 代码中使用,无需去创建。

###JSP最佳实践

  • 不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
  • 其原因为,程序的数据通常要美化后再输出
    • 让jsp既用java代码产生动态数据,又做美化会导致页面难以维护
    • 让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护
    • 因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做

###JSP语法

  • JSP模版元素
    • JSP页面中的HTML内容称之为JSP模版元素
    • JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观
  • JSP表达式
    • JSP脚本表达式(expression)用于将程序数据输出到客户端,语法:<%= 变量或表达式 %>,举例:当前时间:<%= new java.util.Date() %>
    • JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端,所以在JSP表达式中不能使用 ";"。
  • JSP脚本片段
    • JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:<% java代码 %>
    • 注意:JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中
    • JSP脚本片断中的Java代码必须严格遵循Java语法
    • 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素
    • 多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<% %>之中的情况
    • 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句(比如,循环处理模版元素)
  • JSP声明
    • JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面(类成员),语法:<%! java 代码 %>
    • JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法
    • 多个静态代码块、变量和方法可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中
    • JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象
    • JSP声明中,可以覆盖翻译Servlet中的方法(知道就行)
  • JSP注释
    • JSP注释的格式:<%-- 注释信息 --%>
    • JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容(与html注释的区别)
  • JSP指令
    • JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令
      • page指令
      • include指令
      • taglib指令
    • JSP指令的基本语法格式:<%@ 指令 属性名="值" %>,举例:<%@ page contentType="text/html;charset=utf-8"%>
    • 如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写
    • Page指令
      • page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置
      • JSP 2.0规范中定义的page指令的完整语法:
        • language = "java",指定页面所嵌用的语言是Java
        • extends = "package.class ",指定翻译后的Servlet的父类(不要修改)
        • import = "{ package.class | pageckage.* }, ...",在java代码中需要使用的包或类(自动导入的包:java.lang.* ; javax.servlet.* ; javax.servlet.jsp.* ; javax.servlet.http.* ;)

          可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔。 也可以分开写多条,每条导入一个包或类。

        • session="true/false",指定翻译后的Servlet是否默认创建Session对象,默认值是true
        • buffer="none | 8KB | sizeKB",指定JSP的缓冲大小,默认8kb。(在使用out对象写数据的时候,不是直接写给客户端的,而是写入缓冲区,缓冲区满了才会写到客户端)
        • autoFlush = "true | false ",缓冲区满了,是否自动刷新。默认为true
        • isThreadSafe = "true | false ",指定JSP是否线程安全的。true表示非线程安全,false表示线程安全
        • errorPage = "relative_url",指定JSP的错误处理页面
          • errorPage属性的设置必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(不是站点根目录),否则,表示相对于当前页面。
          • 有时候错误提示页面不一定会显示,原因是错误信息量太小,没有达到缓冲区输出的值(1024字节)。可以设置浏览器(不可取),也可以增加信息量
          • 可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中<exception-type>子元素指定异常类的完全限定名,<location>元素指定以"/"开头的错误处理页面的路径
          • 使用<error-page>配置时,还可以根据错误代码数字来配置<error-code>,配置404,500等
          • JSP中的属性配置,优先级大于web.xml的配置
        • isErrorPage = "true | false",指定JSP是否错误处理页面,默认false。如果是错误处理页面,在翻译成Servlet时,就可以获取封装好的异常对象
        • contentType = "mimeType [ ; charset = characterSet]" 如: " text/html ; charset = "UTF-8",告诉jsp引擎,该jsp的类型以及编码
        • pageEncoding = "characterSet",指定整个jsp的编码
        • isELIgnored = "true | false",指定该JSP是否忽略EL表达式,默认false。
      • 使用page指令解决JSP中文乱码
        • JSP的乱码在Tomcat6.0以后已经得到很好的解决,再加上Eclipse工具,基本不会有乱码,会根据pageEcoding来自动更改文件编码
        • 以前的乱码主要是操作系统默认保存文件的编码与Tomcat的默认编码不一致造成的
        • pageEncoding = "characterSet",通知JSP引擎用什么编码来翻译JSP文件
        • contentType,通知翻译后的Servlet用什么类型和编码来设置response,好让浏览器正常显示(如果设置了pageEncoding,这个设置可以不写,但是如果使用记事本编写JSP,就需要再次设置)
    • include指令
      • include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入(编译时包含,编译时引入)
      • 语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用
      • 被引入的文件必须遵循JSP语法
      • 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名
      • 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)
    • taglib指令(导入标签库,后续讲解)

转载于:https://my.oschina.net/raining0822/blog/287407

以下是一个简单的实现文件 MD5 校验的 JavaWeb 项目,包括了 Servlet 和 JSP 界面: 1. 创建一个名为 "MD5Check" 的 JavaWeb 项目。 2. 在 WEB-INF 目录下创建一个名为 "lib" 的文件夹,并将 "commons-codec-1.10.jar" 文件拷贝到该文件夹下。 3. 在 src 目录下创建一个名为 "com.example" 的包,并在该包下创建一个名为 "MD5CheckServlet" 的类。该类继承 HttpServlet,实现 doGet 和 doPost 方法。 ```java package com.example; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Hex; public class MD5CheckServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/md5check.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { InputStream is = request.getPart("file").getInputStream(); try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { md.update(buffer, 0, len); } byte[] digest = md.digest(); String md5 = Hex.encodeHexString(digest); request.setAttribute("md5", md5); } catch (NoSuchAlgorithmException e) { throw new ServletException(e); } request.getRequestDispatcher("/WEB-INF/md5check.jsp").forward(request, response); } } ``` 4. 在 WEB-INF 目录下创建一个名为 "md5check.jsp" 的 JSP 文件,该文件包含一个上传文件的表单和一个用于显示计算出的 MD5 值的元素。 ```jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MD5 Check</title> </head> <body> <h1>MD5 Check</h1> <form action="<%=request.getContextPath()%>/md5Check" method="post" enctype="multipart/form-data"> <input type="file" name="file"/><br/><br/> <input type="submit" value="Check"/> </form> <br/><br/> <% if (request.getAttribute("md5") != null) { %> <p>MD5: <%=request.getAttribute("md5")%></p> <% } %> </body> </html> ``` 5. 在 web.xml 文件中配置 Servlet。 ```xml <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>MD5Check</display-name> <servlet> <servlet-name>MD5CheckServlet</servlet-name> <servlet-class>com.example.MD5CheckServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MD5CheckServlet</servlet-name> <url-pattern>/md5Check</url-pattern> </servlet-mapping> </web-app> ``` 6. 将项目部署到 Tomcat 服务器上,并在浏览器中访问 "http://localhost:8080/MD5Check",即可看到上传文件的表单。选择一个文件并点击 "Check" 按钮,即可计算出该文件的 MD5 值,并显示在页面上。 注意:该示例只是一个简单的演示,没有对上传的文件进行任何验证和限制,使用时需要考虑安全性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值