Jsp(二)

一、什么是JSP

1、定义

JSP全称Java Server Pages即 java服务页面,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

JSP是一种Java servlet【JSP 的本质就是一个servlet】,主要用于实现Java web应用程序的用户界面部分。
它和servelt 一样 可以提供 动态的HTML 响应。 不同的是 Servlet 以java代码为主,JSP 以 html 为主 然后内嵌少量的java 代码。 

  • servlet书写繁复,但是业务逻辑清晰,适用于处理业务逻辑。而展示部分交给jsp处理。
  • jsp = html + java代码 jsp就是一个Servlet。jsp就是一个模板,父类继承HttpServlet。

JSP是Servlet的扩展,JSP没出现之前,就已经出现了Servlet技术.Servlet是利用了"输出流",动态的生成了HTML页面。包括 每一个HTML标签和所有的HTML页面中出现的内容,简单点说就是利用Servlet的输出流将HTML标签生成一个HTML页面。由于时间长了 Servlet中包含了大量的HTML标签、大量的静态文本及格式等,导致了Servlet的开发效率非常低下。

这时候JSP诞生了,JSP弥补了这种情况,JSP通过在标准的THML页面中嵌入JAVA代码,使其静态的部分无需JAVA程序控制,只有那些需要从数据库读取或需要动态生成的页面内容,才使用JAVA脚本控制。

参看链接:https://www.cnblogs.com/xianyao/p/10793478.html有对jsp的简单介绍。

二、jsp的使用

2.1 jsp基础

现在都使用的框架,不会再手动来写jsp的脚本了。

2.2 简单使用

参看链接:https://blog.csdn.net/q5706503/article/details/83549051

2.3 关于静态导入与动态导入

1、静态导入:<%@ include file = "test1.jsp" %>

2、动态导入:<jsp: include page =  "  test2.jsp" %> </jsp:include>

3、区别

静态导入:在导入页面和主页面中引入java代码并且定义名称相同的变量,服务器会报错。因为局部 变量或方法等一系列元素在 ···JSPService(···)方法中声明了两次,这是java语法所不允许的。

动态导入:仍然使用重名变量未报错,因为不同的jsp生成不同的java文件,变量分属不同类的不同方法,因此不会发生冲突。

4、用途

静态导入:当导入的资源没有动态数据的时候,最好使用静态导入;

动态导入:如果存在动态导入数据,最好是用动态导入方式。

5、注意

尽量不要在jsp中写代码,太乱。

三、Jsp的工作原理

访问index.jsp,在tomcat中的web.xml文件中有*.jsp配置。只要是访问的待.jsp的文件,均给转成.java文件了。然后进行一系列的继承,重写。

参看链接:https://www.cnblogs.com/xianyao/p/10793478.html介绍servlet三大作用域与jsp的四大作用域和九大内置对象。

四、路径

4.1相对路径

1、定义:相对路径是相对于当前文件位置的其他文件的访问路径。

2、../表示上一级目录。

3、缺陷:对于将访问的每一个资源的相对路径,必须完全清楚,只有清楚每一个节点,才能进行访问想要访问的资源。并且,资源文件的路径不能轻易改变,会影响到所有访问该资源的其他文件的路径设置,因此不够灵活。所以相对路径适用于上下文目录相邻的并且不轻易改变路径的资源访问。

4.2 绝对路径

1、定义:所谓绝对路径,就是以项目的根路径作为起始点,解决了访问的出发点问题,不再依赖与当前资源的位置,而一律以服务器+项目根路径作为出发点。

2、缺陷:绝对路径的问题是项目部署名称(或者叫上下文路径)固定住了,不够灵活。

4.3 综合路径

1、定义:结合了相对路径与绝对路径的优点。basepath的设定。

2、在jsp文件中,一般都设定了<base href="<%=basePath%>">表示项目的根路径。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'b.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    B
  </body>
</html>

说明:

String path = request.getContextPath();//获取项目的根路径

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
                   http                            localhost                   8080             sxt(项目的部署名称(即项目的根路径))

==》http://localhost:8080/8080/sxt/

综合路径是基于bathpath

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <!-- <base href="<%=basePath%>"> -->
    
    <title>My JSP 'aaaa.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <li><a href="">项目根路径</a></li>
    AAAA
  </body>
</html>

 4.4 注意

4.4.1 在jsp文件中(前端)

1、" "(不加斜杠)表示项目根路径;"/"(加斜杠)表示服务器根路径。

2、相对路径不加/,是相对于当前文件的位置来找其他文件的路径(需要去掉basePath)。

3、绝对路径要加上/,是相对于当前项目的根路径作为起始点(在jsp中/表示服务器的根路径,故如果有项目部署名称,需要加上项目部署名称才表示项目的根路径,如:项目部署名称为reserve,则项目根路径为/reserve/)。(basePath对其无影响)

4、综合路径是设置了basePath的一种相对路径。

5、项目部署名称又叫上下文路径,即项目根目录的名称。项目部署即项目的根路径(如"/reserve/...")

4.4.2 在servlet文件中(后台)

在servlet中,有转发与重定向两种跳转方式,下面分别进行说明。

1、转发:若参数为空" ",则表示当前文件的目录;若为"/",则默认访问项目的根路径。

2、重定向:若参数为空" ",则表示当前文件的目录;若为"/",则表示服务器的根目录。

3、相对路径:不加/表示相对路径,会从servlet所属的文件目录出发开始寻找其他文件的路径;

4、绝对路径:加/表示绝对路径,转发表示项目的根路径,重定向表示服务器的根路径。

5、重定向时不推荐使用/,不够灵活。如果一定要用,注意一定要加上项目的部署名称(即项目的根路径"/reserve/...")。举例:

package cn.bjsxt.zs;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Chongdingxiang1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        /*System.out.println("Chongdingxiang1.service()");
        String music=req.getParameter("music");
        System.out.println("Chongdingxiang1.service()"+music);
        resp.sendRedirect("chongdingxiang2.action?music="+music);*/
        /**
         * 练习
         */
        /*System.out.println("Chongdingxiang1.service()");*/
        // req.setAttribute(name, o);
        resp.sendRedirect("/reserve/a/b/c/...");
    }
}

6、重定向推荐使用上下文路径来设置访问路径(注意:路径和名称是两个概念)

举例:

resp.sendRedirect(req.getContextPath()+"/a/b/c/...");
req.getContextPath()得到的是项目的根目录,没有加/,表示当前文件位置

4.4.3 总结

1、.jsp中与servlet类中""均表示当前文件的目录;

2、加上/后,只有转发表示的是项目的根路径,其他均为服务器的根路径。

五、页面跳转的几种方式

1、超级链接

2、提交表单

3、地址栏输入url

4、转发与重定向(实现自动跳转)(服务器后端实现跳转的方式)

七、get请求与post请求

7.1 解释一

区别一:语义上的区别

1、Get向服务器请求数据。依照HTTP协议,get 是用来请求数据。

2、Post向服务器发数据。依照HTTP协议,Post的语义是向服务器添加数据,也就是说按照Post的语义,该操作是会修改服务器上的数据的。

区别二:服务器请求的区别

1、Get请求是可以被缓存的,举个例子,你访问baidu.com,就是向baidu的服务器发了个Get请求,这个请求的返回,也就是baidu的主页页面内容,会被缓存在你浏览器中,短时间再次访问,其实是拿到的浏览器中的缓存内容。另外Get请求只能接收ASCII码的回复

2、Post请求是不可以被缓存的。对于Post方式提交表单,刷新页面浏览器会弹出提示框  “是否重新提交表单”,Post可以接收二进制等各种数据形式,所以如果要上传文件一般用Post请求。

区别三:参数放请求头和请求体的差别

1、Get请求通常没有请求体(当然这也是可以由程序猿心情改变的),在TCP传输中只需传输一次(而不是一个包),所以Get请求效率相对高。

2、Post请求将数据放在请求体中,而实际传输中,会先传输完请求头,再传输请求体,是分为两次传输的(而不是两个包)。Post请求头会比Get更小(一般不带参数),请求头更容易在一个TCP包中完成传输,更何况请求头中有Content-Length的标识,可以更好地保证Http包的完整性。

7.2解释二

POST和GET都是向服务器提交数据,并且都会从服务器获取数据。

区别:

1、传送方式:get通过地址栏传输,post通过报文传输。

2、传送长度:get参数有长度限制(受限于url长度),而post无限制

3、GET和POST还有一个重大区别,简单的说:

GET产生一个TCP数据包;POST产生两个TCP数据包

长的说:

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

1. GET与POST都有自己的语义,不能随便混用。

2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

案例:一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来。

拓展资料:

GET在浏览器回退时是无害的,而POST会再次提交请求。

GET产生的URL地址可以被Bookmark,而POST不可以。

GET请求会被浏览器主动cache,而POST不会,除非手动设置。

GET请求只能进行url编码,而POST支持多种编码方式。

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

GET请求在URL中传送的参数是有长度限制的,而POST么有。

对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

GET参数通过URL传递,POST放在Request body中。

posted @ 2020-06-04 17:35  慎终若始  阅读(28)  评论(0编辑  收藏  举报