Jsp技术介绍

前言

虽然在前后端分离的大潮流中,jsp技术已经是很少被使用了,其中一个重要的原因是jsp展示页面的时候过慢。但是,作为sun官方推出的技术,其中的思想和今天的前端技术十分的相似,很多前端框架都是基于这些思想的。所以,学习一下jsp还是十分有必要的。

Jsp的原理

简单来讲,使用jsp技术,可以将java的代码使用<%%>标签嵌入到html页面当中。 但是,为什么可以这样用呢? 比如说,现在有个页面叫做a.jsp。当你访问它的时候,服务器就会作出相应的响应,将jsp页面编译成Servlet实例,你不知道Servlet也没有什么关系,这玩意其实就是一个服务器的逻辑处理部分,能够把前端传过来的值进行处理并作出相应的响应。早期的web开发都是用的这个,但是这东西开发起来有些麻烦,已经渐渐使用的少了,但是作为基本内容,同样是十分的重要。 注意:只有当客户端第一次访问服务器的时候才会进行编译,第二次再访问的时候,客户端就可以直接获取到生成后的页面了。

Jsp的基本内容

  • Jsp注释 注释语法:
<%--这里写注释内容--%>
  • Jsp声明 语法:
<%!声明的内容%>

请注意,声明中的内容最终会被转换成Servlet的成员变量和成员方法,所以在声明变量的时候就可以使用public、private等修饰符号,但是绝对不能使用abstract进行修饰,因为这样会导致Servlet也变成抽象类,就会造成无法实例化的情况。这样是绝对需要避免的。

  • Jsp输出 输出语法:
<%=输出的内容%>

其实这条语句同样可以用out.println方法进行作为替换,但还是这样简单的一条语法较为简单。但是还有一点,使用输出语法的时候,java代码的末尾不需要加分号,其他的就需要加分号了。

  • Jsp脚本 所谓的jsp脚本,其实就是将java语言写在<%%>这条语法中,来操作数据而已。
<%
        //注册数据库
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/keyan","root","root");
        //创建一个语句
        Statement statement = connection.createStatement();
        //创建一个查询语句
        String sql = "SELECT * FROM e_person";
        //使用查询
        ResultSet rs = statement.executeQuery(sql);
        while(rs.next()){

%>
    <table border="1" bgcolor="#ffd700" width="250px">
        <tr>
           <td>工号:<%rs.getString(1);%></td>
            <td>姓名:<%rs.getString(2);%></td>
        </tr>
    </table>

    <%}%>

上面这段jsp脚本,其实就是常规的用java链接数据库的操作。 注意:jsp脚本中的内容都是使用servlet中的方法进行输出的,所以,很显然在jsp脚本中是不能定义方法的。

Jsp编译命令

所谓的jsp编译命令,就是在通知服务器的jsp引擎,我需要什么东西、我有什么东西、、我是什么格式等等内容。 比如说导入一个java包,设置一些属性等等操作。

  • page指令
<%@ page 属性=""%>

page指令又如下的属性,使用page指令就是操作这些属性而已。 具体的属性以及操作,可以参考这篇博客:jsp中page的各个属性介绍 还有一点,Jsp内建了异常处理机制,所以在脚本中就不需要对异常进行处理了。 - include指令

<%@ include file=""%>

这个指令可以将另外一个文件加载到当前的页面之中。

  • taglib指令 这条指令暂时不做介绍。

Jsp的动作指令

  • forward指令:将页面转发到另外一个页面
<jsp:forward page="roobtyan.jsp">
    <jsp:param name="roobtyan" value="go"/>
</jsp:forward>

访问当前网址的时候,会转发到roobtyan.jsp这个页面。并将参数name和他的值传到这个页面。

  • param指令 :用于传递参数,需要和支持参数的标签一起使用 使用的方法如上面的例子所示。
  • include指令 :动态引入一个jsp页面
<jsp:include page="roobtyan.jsp">
    <jsp:param />
</jsp:include>

请注意这里的include不同于编译指令中的include。这里的include是动态的导入,而之前的是静态导入。动态导入后,被导入的jsp页面的编译指令失去作用;而静态导入则不会出现这种情况。 还有一点,使用这个引入的时候,也是可以加入参数的。

  • plugin指令 :下载javaBean到页面执行 基本上已经不再使用了,这里就不介绍了。
  • useBean指令:实例化javaBean 语法格式:
<jsp:useBean id="name" class="className" scope="page"/>

id是实例化的名称,class是javaBean(类)的名称,scope是可用范围,这个后面会介绍。

  • setProperty指令:设置javaBean实例属性值 实例化的方式:
<jsp:setProperty name="name" property="id" value="01"/>

name是实力的名字,property为属性名称,value自然就是值了。

  • getProperty指令 :获取javaBean实例属性值
<jsp:getProperty name="name" property="id"/>

Jsp的内置对象

  • application对象:web应用本身 作用:
1.共享数据:将某个需要共享的值放到application中,就可以在可用范围内进行使用
<%
    //设置参数
    application.setAttribute("name","roobtyan");
    //获取参数
    String name = application.getAttribute("name");
%>

2.获得web应用配置参数
比如说,当前的xml文件中有如下配置参数,我要获取到它
<context-param>
    <param-name>name</param-name>
    <param-value>roobtyan</value>
</context-param>
使用的方法如下
String name = application.getInitParameter("name");
  • config对象
web.xml配置文件如下:
<servlet>
    <init-param>
        <param-name>name</param-name>
        <param-value>roobtyan</param-value>
    </init-param>
</servlet>

获取方法
String name = config.getInitParameter("name")
  • exception对象 注意:exception对象只有在errorPage中才起作用,也就是说这个对象只有在异常处理页面中才能起作用。虽然jsp脚本中的java代码无需做异常处理,但是在jsp声明中的代码必须做异常处理。
  • out对象 这个对象就是用来输出内容的,和输出语法类似。
<%
    out.println("哈哈哈");
%>
  • pageContext对象 这个对象代表的是页面上下文,用于访问jsp页面间的共享数据。 这个对象又两个常用的方法:
getAttribute(String name):取得page范围内的name属性
getAttribute(String name,int scope):取得指定范围内的属性值,scope有如下常量
    PageContext.PAGE_SCOPE:page内(值:1)
    PageContext.SESSION_SCOPE:session内(值:3)
    PageContext.REQUEST_SCOPE:request内(值:2)
    PageContext.APPLICATION_SCOPE:application内(值:4)
//将变量放入指定内容内
setAttribute(String name,value,scope)
//默认存放在page中
setAttribute(String name,value)
  • request对象
常用方法:
String getParameter(String paramName):获取请求参数的值
Map getParameter():获取所有请求参数的名称和值
Enumeration getParameterNames():获取所有请求参数名称组成的对象
String[] getParameterValues(String name):获取name的所有值,如果又多个值的话

//请求头相关的方法
String getHeader(String name):获取请求头的值
Enumeration<String> getHeaderNames():获取所有请求头的鸣横
Enumeration<String> getHeaders(String name):获取指定请求头的多个值
int getIntHeader(String name):获取指定请求头的值,并转换成整数值
  • response对象 作用如下
1.生成非字符响应:使用相关的类生成一张图片等
2.重定向:
    response.sendRedirect("roobtyan.jsp");
    将页面重定向到roobtyan.jsp中
注意:重定向和转发是有一定的区别的-->
    转发操作依然是一次请求,而重定向是二次请求
    转发操作所有的原页面的数据、参数等都存在,而重定向这些参数都会消失
    转发地址栏的URL不变,而重定向连URL都会改变
3.增加Cookie
//增加Cookie
Cookie c = new Cookie("name","roobtyan");
c.setMaxAge(24*3600);//设置Cookie存在的周期,不设置的话,关闭浏览器cookie就没了
reponse.addCookie(c);

//获取Cookie
Cookie[] cookies = request.getCookie();
  • session对象 通过我上面的介绍,可以看到,不论是request还是response、page等,都有可能会无法使用,而session解决了这个问题:在多个页面使用同一个变量 session对象依然是使用键值对的方式存储的。
//存储方法
session.setAttribute("name",roobtyan);
//获取方法
session.getAttribute("name");

结语

我这一节要介绍的部分就这么多,其实JSP中还有一部分内容叫做自定义标签,由于现阶段并不怎么用,所以这部分内容就暂时不介绍了,有兴趣的小伙伴可以搜索一下。当然,还有一个使用jsp过程中常用的标签库,就是sun公司推出的jstl,这套库非常的强大,应该是属于必学的内容,就是一个简单的使用,教程链接在这里:https://www.yiibai.com/jsp/jstl.html

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗 邮箱:roobtyan@outlook.com 个人博客:http://roobtyan.cn

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

在SQLMAP中使用动态SQL

最近有几个同事和朋友询问如何在SQLMAP中“拼接字符串”,因为有时候条件的数量不固定,条件参数类型也不固定,无法写出 @参数名 这样的SQL语句,也就是大家常...

2229
来自专栏自动化测试实战

RF接口测试(2)--http请求之get

5248
来自专栏york技术分享

sed 使用教程 - 通读篇(30分钟入门系列)

和上篇 awk 分享一样,作为通读性的分享,不想引入太过复杂的东西,依然从日常工作中碰到的 80% 的需求出发,重点阐述最重点的部门,工作原理等,普及一些对se...

50122
来自专栏大内老A

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

在《中篇》中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的。总的来说,管道由一个服务器和一个Htt...

2845
来自专栏决胜机器学习

设计模式专题(十七) ——单例模式

设计模式专题(十七)——单例模式 (原创内容,转载请注明来源,谢谢) 一、概述 单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访...

3787
来自专栏idba

浅谈 multiprocessing

一前言 使用python进行并发处理多台机器/多个实例的时候,我们可以使用threading ,但是由于著名的GIL存在,实际上threading 并...

940
来自专栏我的博客

CI基础知识笔记

1.知识点 $config[‘url_suffix’] = ”;//url后缀 $config[‘enable_query_strings’] = FALS...

2853
来自专栏Android 研究

Android系统启动——3init.rc解析

init.rc文件是以“块”(section)为单位服务的,,一个“块”(section)可以包含多行。“块”(section)分成两大类:一类称为"动作(ac...

4612
来自专栏杂项

Leveldb 源码类功能解析

Leveldb 的基本介绍网上很多资料,这里不赘述,我们直接进入主题,解析 leveldb 源码中各个类(概念)的功能。

29514
来自专栏大闲人柴毛毛

Java并发编程的艺术(十二)——线程安全

1. 什么是『线程安全』? 如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。 2. ...

3765

扫码关注云+社区

领取腾讯云代金券