zoukankan      html  css  js  c++  java
  • JavaWeb——JSP开发1

    1、什么是jsp,为什么要使用jsp。

      再使用idea创建完一个web工程后,在webapp目录下会生成一个index.jsp

      直接编译运行,网站将自动打开这样一个网页:

      所以我们可以推测这个index.jsp就是决定这个项目的初始页面的HTML编码的,这里的hello-world是部署Tomcat时设置的。

      所以其实JSP就是用来编写HTML编码的一种解决方案,那为什么需要额外的这样一套解决方案呢?

      这是我之前对Servlet简单的使用:

            PrintWriter writer = resp.getWriter();
            writer.append("<!DOCTYPE html>
    ")
                    .append("<html >
    ")
                    .append("   <head>
    ")
                    .append("       <title>hello user application</title>
    ")
                    .append("   </head>
    ")
                    .append("   <body>
    ")
                    .append("       Hello, ").append(user).append("!<br/><br/>
    ")
                    .append("         <form action="first" method="POST">")
                    .append("              Enter your name:<br/>
    ")
                    .append("              <input type="text" name="user"/><br/>
    ")
                    .append("              <input type="submit" value="Submit"/>
    ")
                    .append("         </form>
    ")
                    .append("     </body>
    ")
                    .append("</html>
    ");

      这是在像response添加正文,用于HTML的编码,可以发现这里HTML和Java结合得并不好,导致代码很长还很乱,特别是引号需要转义符。所以其实我们应该把这一块HTML编码独立出去,所以就有了这样一套名为JSP(JavaServerPages)的混合解决方案,它结合了Java代码和HTML标签,JSP包括了所有的HTML标签,以及内建的JSP标签、自定义的JSP标签以及表达式语言。

    2、JSP在运行时的处理

    • 其实JSP只是一个精心设计的Servlet,JSP只是一种语法糖,在运行的时候JSP代码将由JSP编译器进行转换,它将解析出JSP代码的特性并把它们转换成Java代码,由JSO创建得到的Java类都将实现Servlet,最后和其他Servlet一样对请求做出响应。
    • JSP和其他Servlet一样有自己的生命周期,不同的Web容器不一样,比如在Tomcat中JSP将在第一次请求到达之前被即时的转换并编译,对于之后的请求可以之间使用编译好的JSP。而许多其他的容器则提供了在部署应用程序时预编译所有的JSP选项。

    3、JSP指令

      JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

    • <%@ page ... %>提供了对JSP如何进行转换、渲染和传输到客户端的控制
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>

      其中language将告诉容器JSP使用的是那种脚本语言,contentType和charset将设置JSP页面的MIME类型和字符编码,

      page指令相关的属性:

    buffer 指定out对象使用缓冲区的大小
    autoFlush 控制out对象的 缓存区
    contentType 指定当前JSP页面的MIME类型和字符编码
    errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
    isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
    extends 指定servlet从哪一个类继承
    import 导入要使用的Java类
    info 定义JSP页面的描述信息
    isThreadSafe 指定对JSP页面的访问是否为线程安全
    language 定义JSP页面所用的脚本语言,默认是Java
    session 指定JSP页面是否使用session
    isELIgnored 指定是否执行EL表达式
    isScriptingEnabled 确定脚本元素能否被使用
    • JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
    <%@ include file="文件相对 url 地址" %>
    • JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

    <%@ taglib uri="uri" prefix="prefixOfTag" %>

     

    4、在JSP中使用Java

      jsp中写java代码有如下三种方式:

      <%! %>,这里面可以申明变量或方法,注意:这里面申明的变量是全局的

      <% %>,与上面的方法相比,这个方法的局部的

      <%= %>,用于输出表达式到浏览器,注意:这里面的表达式不能跟分号

    • 使用JSP中的隐式变量

      JSP文件提供了几个可以在脚本和表达式中可以使用的隐式变量,这些变量不需要在任何位置定义即可使用它们,JSP规范要求JSP的转换器和编译器提供这些变量,名字也要完全相同。从一个编译后的JSP文件中可以看到这样一些代码片段

     1   public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
     2       throws java.io.IOException, javax.servlet.ServletException {
     3 
     4     final javax.servlet.jsp.PageContext pageContext;
     5     javax.servlet.http.HttpSession session;
     6     final javax.servlet.ServletContext application;
     7     final javax.servlet.ServletConfig config;
     8     javax.servlet.jsp.JspWriter out = null;
     9     final java.lang.Object page = this;
    10     javax.servlet.jsp.JspWriter _jspx_out = null;
    11     javax.servlet.jsp.PageContext _jspx_page_context = null;
    12 
    13     try {
    14       response.setContentType("text/html; charset=UTF-8");
    15       pageContext = _jspxFactory.getPageContext(this, request, response,
    16                   null, false, 8192, true);
    17       _jspx_page_context = pageContext;
    18       application = pageContext.getServletContext();
    19       config = pageContext.getServletConfig();
    20       out = pageContext.getOut();
    21       _jspx_out = out;
    22

      这里总共定义了8个隐式变量,分别是:

    • request、response

      HttpServletRequest类和HttpServletResponse类的实例

    • pageContext

       PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问

    • session

      HttpSession类的实例,如果在page指令中的session特性设置为假那么JSP中就没有这个变量

    • application、

      ServletContext类的实例,与应用上下文有关

    • config、

      ServletConfig类的实例,可以使用该对象访问JSP Servlet的配置,例如Servlet初始化参数

    • out、

      JspWriter类的实例,用于把结果输出至网页上

    • page

      类似于Java类中的this关键字,提供了请求特性和回话特性值、访问请求和响应、包含其他文件、转发请求的几个便利方法

      最后还有一个exception这里没有出现,这个变量需要通过page指令的isErrorPage特性设置为真,表示该JSP的目的是用于处理错误,才会出现这个变量。

      创建一个first.jsp文件,添加以下的代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" %>
    <%!
        private static final String DEFAULT_USER = "Guest";
    %>
    <%
        String user = request.getParameter("user");
        if(user == null){
            user = DEFAULT_USER;
        }
    %>
    <!DOCTYPE html>
    <html>
        <head>
        <title>first user application</title>
        </head>
        <body>
            hello, <%= user %> ! <br/><br/>
            <form action="first.jsp" method="post">
                    输入用户名:<br/>
                    <input type="text" name="user"/><br/>
                    <input type="submit" value="Submit"/>
            </form>
        </body>
    </html>

      编译运行,在浏览器中输入http://localhost:8080/hello-world/first.jsp就可以得到下面这个网页

      这里就实现了之前的Servlet,不过其实并不应该在JSP中使用Java

    5、注释

      在JSP中实现代码注释的方法有四种:

    • XML注释
      <!-- 这是被注释的内容 -->

      但是这种类型的注释将被发送到客户端,浏览器将会忽略它,但是它会出现在响应的源代码中注释中的任何JSP代码都将会被处理,

    <!-- 这是被注释的内容<%!private static final String DEFAULT_USER = "Guest";%> -->

      这里的java代码就将会被执行。

    • 传统的java行注释以及java块注释,也就是//...和/*...*/
    <%
        String user = request.getParameter("user");
    //    if(user == null){
    //        user = DEFAULT_USER;
    //    }
    /*
            String pwd = req.getParameter("pwd");
        String sex = req.getParameter("sex");
     */
    %>
    • JSP注释
    <%-- JSP注释掉的内容 --%>

    6、结合使用Servlet和JSP

    • 配置部署描述符中的JSP属性

        在空的web.xml文件(只包含<display-name>)中,添加以下内容:

      <jsp-config>
        <jsp-property-group>
          <url-pattern>*.jsp</url-pattern>
          <url-pattern>*.jspf</url-pattern>
          <page-encoding>UTF-8</page-encoding>
          <scripting-invalid>false</scripting-invalid>
          <include-prelude>/WEB-INF/jsp/base.jspf</include-prelude>
          <trim-directive-whitespaces>true</trim-directive-whitespaces>
          <default-content-type>text/html</default-content-type>
        </jsp-property-group>
      </jsp-config>

      标签<jsp-config>中可以包含任意数目的</jsp-property-group>标签,这个属性用于区分不同JSP组的属性。例如为/WEB-ING/JSP/admin文件夹中所有的JSP定义一组通用的属性,为/WEB-ING/JSP/help定义另一组属性,那么需要通过定义<url-pattern>标签来区分不同的属性组,其中一个被设置为<url-pattern>/WEB-ING/JSP/admin/*.jsp</url-pattern>,另一个则被设置为<url-pattern>/WEB-ING/JSP/help/*.jsp</url-pattern>。

      <include-prelude>标签将告诉容器在所有属于该属性组中的JSP的头部添加文件/WEB-INF/jsp/base.jspf,可以用于定义公共变量、标签库声明或共享其他可作用于属性组所有的JSP资源。类似的<include-coda>标签定义了包含在组中所有JSP尾部的文件。在一个JSP组中可以同时多次使用这些标签。

      <page-encoding>与page指令的pageEncoding特性一致,因为JSP的默认内容类型为text/html,所以只需要通过<page-encoding>将字符编码设置为UTF-8即可。还可以使用<default-content-type>标签以其他默认的内容类型覆盖text/html。

      <trim-directive-whitespaces>标签告诉JSP转换器删除响应输出中的空白,只保留由指令、声明、脚本和其他JSP标签创建的文本。

      <scripting-invalid>标签设置为假时:允许在组中的所有JSP中使用Java。如果把这个设置为真,在组中使用Java将引起转换错误。标签<el-ignored>的作用类似,不过它对应的是page指令中的isELIgnored特性。如果它的值为真,那么组内的JSP将禁止使用表达式语言。它的默认值同样为假。

    <%@ page import="model.Ticket, model.Ticket" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

      以上是base.jspf的内容,该代码完成了两件事情:为所有的JSP导入这些类,并声明JSPL核心代码库。

      这是webapp的文件结构,将文件添加到WEB-INF下可以阻止用户通过浏览器访问这些JSP,因为WEB-INF目录中的文件是禁止通过Web访问的。依赖于由重定向Servlet和JSP提供的回话和请求特性的JSP都可以添加到WEB-INF中。

      先写一个简单的jsp:

    <%@ page session="false" %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Customer Support</title>
        </head>
        <body>
            <h2>Create a Ticket</h2>
            <form method="POST" action="tickets" enctype="multipart/form-data">
                <input type="hidden" name="action" value="create"/>
                Your Name<br/>
                <input type="text" name="customerName"><br/><br/>
                Subject<br/>
                <input type="text" name="subject"><br/><br/>
                Body<br/>
                <textarea name="body" rows="5" cols="30"></textarea><br/><br/>
                <b>Attachments</b><br/>
                <input type="file" name="file1"/><br/><br/>
                <input type="submit" value="Submit"/>
            </form>
        </body>
    </html>

      然后创建一个简单的Servlet在加上代码:

    @WebServlet(
            name = "TestServlet",
            urlPatterns = {"/test"}
    )
    public class TestServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.getRequestDispatcher("/WEB-INF/jsp/view/ticketForm.jsp")
                    .forward(request, response);
        }
    }

      然后在使用浏览器访问http://localhost:8080/hello-world/test时就是在访问这个JSP了

  • 相关阅读:
    北京除了木樨园哪里有卖布料的?要高级布料,不要那种便宜的小摊。
    郭培_百度百科
    木樨园批发市场淘布归来
    九头身美女_百度百科
    「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣
    时间囊咖啡馆免费提供小型活动场地_豆瓣
    北京的布料市场
    适合入门自学服装裁剪滴书(更新ing)
    不说技术~2016-07-02我们是幸福的一家人
    插件~使用ECharts动态在地图上标识点~动态添加和删除标识点
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/8375828.html
Copyright © 2011-2022 走看看