• Java匹马行天下之JavaWeb核心技术——JSP


    JSP动态网页技术

    一、JavaWeb简介

    一、什么是JavaWeb?

    •  JavaWeb是用Java技术来解决相关web互联网领域的技术总称。
    •  需要在特定的web服务器上运行,分为web服务器和web客户端两部分
    •  跨平台,能够在多个平台下部署和运行

    二、静态网页和动态网页

    • 静态网页:网页中的内容是固定的,不会更新。
    • 所用技术为html、css;
    • 动态网页:网页中的内容通过程序动态显示的,自动更新。
    • 所用技术为html、css、数据库、至少一门高级语言(Java、C#,PHP),JavaScript,XML等,主流的动态网页脚本技术(jsp/Asp.net/php)

    三、Tomcat服务器目录介绍

     

    WEB-INF是Java的Web应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。

    web.xml文件是项目的部署文件

    classes文件夹,用于放置*.class文件

    lib文件夹,用于存放需要的jar包

    如图:

     

    四、修改Tomcat服务器默认端口

    在Tomcat的安装目录下,找到conf-->server.xml文件

     

    找到Connector标签

     

    修改port属性的值即可,端口修改完成后要记得保存,并且重启Tomcat服务器。

    二、JSP基础学习

    一、JSP简介

    JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了再Java当中使用HTML标签。JSP是一种动态网页技术标准也是JavaEE的标准。JSP与Servlet一样,是在服务器端执行的。

    JSP实际上就是Servlet。JSP这门技术的最大的特点在于:写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

    二、JSP的作用

    • Servlet:服务器端的小应用程序。适合编写Java逻辑代码,如果编写网页内容------->费时费力,太苦

    缺点:不适合设置HTML响应体,需要大量的

    response.getWriter().print("<html>");

    优点:动态资源,可以编程。

    • HTML:静态内容

    缺点:HTML是静态页面,不能包含动态信息;

    优点:不用为输出html标签而发愁。

    • jspjava server pages):适合编写输出动态内容,但不适合编写Java逻辑

    优点:在原有HTML的基础上添加java脚本,构成jsp页面。

    三、JSP和Servlet的分工

    • JSP

    作为请求发起页面,例如显示表单、超链接。

    作为请求结束页面,例如显示数据。

    • Servlet

    作为请求中处理数据的环节

    四、JSP的组成

     

    jsp=html+java脚本+jsp标签(指令)

    jsp中无需创建即可使用的对象一共有9个,称为九大内置对象。

    3种java脚本:

    • <%……%> java代码片段(常用),用于定义0-N条java语句,方法内写什么就可以在这里写什么,不能声明方法和类;
    • <%=……%> java表达式,用于输出(常用),用于输出一条表达式(或变量)的结束,print()括号中参数可以放什么,这里就能放什么;
    • <%!……%> 声明,用来创建类的成员变量和成员方法(基本不用),class A{ } 类体中可以放什么,这里就可以放什么。

    五、JSP的执行流程及原理

     

    jsp其实是一种特殊的Servlet

    • 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个Servlet类);
    • 然后再把java编译成.class;
    • 然后创建该类对象;
    • 最后调用它的service()方法;
    • 第二次请求同一jsp时,直接调用service()方法。
    • 在Tomcat的work目录下可以找到jsp对应的.java源代码。

    1、IE浏览器在访问JSP页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)

    •   第一次:转译(翻译) --> 编译 --> 执行
    •   第二次:执行

    2、Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?

    •   out.print("<......>"); 或者 out.write("<......>");

    3、Jsp页面中的java代码服务器是如何执行的?

    •   服务器 --> .java文件 --> .class文件 --> 结果out回客户端

    4、Web服务器在调用jsp时,会给jsp提供一些什么java对象(内置对象)?

    •   HttpSession、ServletConfig、ServletContent、request、response、out等等。

    六、JSP的基本语法

    •   Servlet:控制器。重点编写java代码逻辑。(获取表单数据、处理业务逻辑、分发转向)
    •   JSP:代码显示模板。重点在于显示数据。(为什么显示数据不直接用.html文件呢?因为.jsp文件中可以插入java代码显示回显消息,简言之,jsp功能更强大)

     1、JSP的模版元素:简言之就是网页的静态内容

        例如:html标签和普通文本。

     2、JSP的脚本     

    • <%……%> java代码片段(常用),用于定义0-N条java语句,方法内写什么就可以在这里写什么,不能声明方法和类;
    • <%=……%> java表达式,用于输出(常用),用于输出一条表达式(或变量)的结束,print()括号中参数可以放什么,这里就能放什么;

            <%= 2 + 3 %> 等价于out.print(2 + 3);

    • <%!……%> 声明,用来创建类的成员变量和成员方法(基本不用),class A{ } 类体中可以放什么,这里就可以放什么。

     

        3、注释

        JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量

        网页注释:<!-- 网页注释 -->     特点:不安全,费流量

    七、JSP的三个指令

     JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分

     在JSP 2.0规范中共定义了三个指令: 

    •   page指令(页面级别)
    •   include指令(导入其它页面的信息)
    •   taglib指令(标签指令)

    例如:

     

     1page

        作用:page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。

            为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。 

        属性

    •      importjava代码中的import是一样的。

            <%@ page import="java.util.Date, java.util.List" %>

            或者:

            <%@ page import="java.util.Date" %>

            <%@ page import="java.util.List" %>

            JSP会自动导入(默认导入)以下的包:

              import java.lang.*;

              import javax.servlet.*;

              import javax.servlet.http.*;

              import javax.servlet.jsp.*;

    •      session: 表示是否会自动创建session对象。其默认值是true
    •       buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小,默认大小是8kb。建议最好不要改大小。
    •      errorPage: 如果页面中有错误,则跳转到指定的资源。(即不让页面弹出404/500等错误)

            errorPage="/uri" 

            如果写"/"则代表当前应用的目录下,绝对路径。

            如果不写"/"则代表相对路径。

    •      isErrorPage: 表示是否创建throwable对象。其默认值是false。作用:输出页面错误信息:by zero
    •      contextType: contentType="text/html; charset=UTF-8" 告诉浏览器使用什么编码来解析文本。等同于 response.setContextType("text/html; charset=utf-8"); 
    •      pageEncoding: 告诉JSP引擎(服务器)要转译(翻译)的文件使用的编码。

            例如:<%@ page  pageEncoding="gbk" %>

    •      isELIgnored: 是否支持EL表达式。 默认是false,表示支持EL表达式。

            例如:${1+1}  等价于out.print(1+1);

       

       

    2include

          include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

    •         静态包含:把其它资源包含到当前页面中。

              <%@ include file="/include/header.jsp" %>

    •         动态包含:

              <jsp:include page="/include/header.jsp"></jsp:include>

            两者的区别:转译(翻译)的时间段不同

    •           前者:在翻译时就把两个文件合并
    •           后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

            使用原则:能用静的就不用动的。原因之一是:可以省略一些代码的书写。

       3taglib

    JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

    Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

    Taglib指令的语法:

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

      

    uri属性确定标签库的位置,prefix属性指定标签库的前缀。

    等价的XML语法:

    <jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
    

      

          作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

            <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    prefix:前缀(相当于重新给uri起个名字)

           示例:

        

               <%   
    
              if (5 > 3) { 
    
              out.print(5); 
    
              } 
    
            %> 
    
            <%-- 上下二种方式是等价的 --%>
    
            <c:if test="${5>3}"> 
    
              aaa 
    
            </c:if>

          下面的这种方式很好用!后面慢慢体会。

       

    八、JSP的动作

    使用标签的形式来表示一段java代码。

     

    JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。

    行为标签只有一种语法格式,它严格遵守XML标准:

    <jsp:action_name attribute="value" />
    

      

    行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:

    九、JSP的九个内置对象

    指在JSP的<%=%> 和<% %>中可以直接使用的对象,服务器给我们创建好的对象,直接拿过来用就行了。

          例如:

         

              <%=request.getParameter("name") %>
    
          <%
    
             Student stu = new Student();
    
             stu.setName("tom");
    
             out.print(stu.getName());
    
             // request.getRequestDispatcher("/7.jsp").forward(request, response);
    
           %>
    

      

     

    十、JSP客户端请求

    HttpServletRequest类

    request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。

    request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。

    接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:

    HTTP信息头示例

    在这个例子中,我们会使用HttpServletRequest类的getHeaderNames()方法来读取HTTP信息头。这个方法以枚举的形式返回当前HTTP请求的头信息。

    获取Enumeration对象后,用标准的方式来遍历Enumeration对象,用hasMoreElements()方法来确定什么时候停止,用nextElement()方法来获得每个参数的名字

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*,java.util.*" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <h2>HTTP 头部请求实例</h2>
    <table width="100%" border="1" align="center">
    <tr bgcolor="#949494">
    <th>Header Name</th><th>Header Value(s)</th>
    </tr>
    <%
       Enumeration headerNames = request.getHeaderNames();
       while(headerNames.hasMoreElements()) {
          String paramName = (String)headerNames.nextElement();
          out.print("<tr><td>" + paramName + "</td>
    ");
          String paramValue = request.getHeader(paramName);
          out.println("<td> " + paramValue + "</td></tr>
    ");
       }
    %>
    </table>
    </body>
    </html>
    

      

    十一、JSP服务器响应

    HttpServletResponse类

    response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。

    response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。

    下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:

     

    HTTP响应头程序示例

    接下来的例子使用setIntHeader()方法和setRefreshHeader()方法来模拟一个数字时钟:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*,java.util.*" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <h2>自动刷新实例</h2>
    <%
       // 设置每隔5秒自动刷新
       response.setIntHeader("Refresh", 5);
       // 获取当前时间
       Calendar calendar = new GregorianCalendar();
       String am_pm;
       int hour = calendar.get(Calendar.HOUR);
       int minute = calendar.get(Calendar.MINUTE);
       int second = calendar.get(Calendar.SECOND);
       if(calendar.get(Calendar.AM_PM) == 0)
          am_pm = "AM";
       else
          am_pm = "PM";
       String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
       out.println("当前时间: " + CT + "
    ");
    %>
    </body>
    </html>
    

      

    此篇是我在学习过程中参考菜鸟教程以及笔记和别人博客(黑泽君)完成

    Java匹马行天下依旧在更新中,欢迎大家关注,感觉可以的可以点击一下推荐,若如有误,感谢指正,谢谢!

  • 相关阅读:
    JQuery checkbox全选多次点击后无效解决方法
    mongodb更新数据
    EasyUI--datebox设置默认时间
    转载:MyEclipse中防止代码格式化时出现换行的情况的设置
    Java 多维数组 按某列 排序
    Java Entry使用
    matlab使用reshape时按照列优先原则取元素和摆放元素
    boost--signal
    boost--function
    boost--bind
  • 原文地址:https://www.cnblogs.com/zyx110/p/10926587.html
Copyright © 2020-2023  润新知