JSP原理及运用+EL表达式+jstl

JSP(java Server Page)

简介

因为Servlet中用来做页面需要疯狂的拼接字符,为了解决在service中响应页面的问题,使用JSP技术来实现更为合适

  • Servlet中的写法:
resp.setCharacterEncoding("UTF-8");
PrintWriter printWriter = resp.getWriter();
printWriter.println("n" +
        "n" +
        "n" +
        "    n" +
        "    登录n" +
        "n" +
        "n" +
        "欢迎使用n" +
        "n" +
        "");

JSP和Servlet区别

  • JSP底层就是一个Servlet,在执行的时候先转成Servlet然后同样要经历Servlet的生命周期;
  • 如果想把页面做好看一些,怎么做?很明显Servlet是不行的,所以需要用到JSP(看上去就跟HTML页面差不多),Servlet主要是处理业务为主(Java后台代码),JSP主要以表现为主(HTML,CSS,JS等前端代码);
  • Servlet更擅长逻辑的编写,Jsp更擅长于数据的显示,以后我们开发会慢慢达到一个目标,servlet里面不要写HTML代码,jsp里面不要写java代码;

入门

  • 创建一个javaWeb项目
  • 创建JSP文件

image.png

  • 启动tomacat测试

JSP原理

图片.png

语法

语法用于在JSP页面使用java代码
语法分类:


``



``





注意

  • 如果没有导入jsp的jar包,页面会报错,但是不影响运行(tomcat — lib — jsp.ar);
  • 不能直接拖到浏览器上面运行,它只能在服务器上面(JSP是服务器端页面)使用,服务器对它作了编译的。如下图直接运行时显示的是源码,并不是页面效果:

图片.png

JSP三大指令

  • page

当前页指令,只对当前页作
eg:如果当前head.jsp页面报错,需要给客户转到hello.jsp页面,只需要在Page指令后面加errorPage属性,然后在hello.jsp页面的Page指令里面加属性isErrorPage并设值为true

head.jsp页面:

hello.jsp页面:

  • include静态引入;

不同的页面包含相同的内容,可以把相同的页面提取出来进行引用,比如导航栏head.jsp是a.jsp页面和b.jsp页面共有的,就可以对head.jsp页面进行引用

image.png

页面a和页面b都使用这句代码引用head.jsp:

先引入head代码,然后同意转换成一个.java文件
>
  • taglib:标签指令(JSTL);

内置对象

JSP转换成java代码的时候自动生成的对象代码

内置对象 类
application ServletContext 全局对象
session HttpSession 会话对象
request HttpServletRequest 请求对象
pageContext PageContext 当前页对象
response HttpServletResponse 响应对象
out JspWriter 输出对象
page this 当前对象
config ServletConfig 配置对象
exception 异常对象

四大作用域对象 存取数据

类 对象(叫法) 范围
PageContext pageContext 当前页面(作用不大) 当前页,直接使用就是,根本不需要在放到对象里面
HttpServletRequest request 一次请求(必需请求转发)
HttpSession session 一次会话
ServletContext application 整个应用(有且只有一个对象)

在Servlet中的操作

  • 一次session包含多次Request,session就像打电话,而Request只是其中一个话题
    注意:
    不能跨域取值
//获取数据

//打印数据



图片.png

如上,只能读取Request域的值,其他域因为没有赋值就不能读取,显示“NULL`

  • 在自己写的类中使用内置对象
    先使用Request.get作用域的类,拿到对象再使用
HttpSession session = request.getSession();
ServletContext application = request.getServletContext();
  • 获取Servletcontext的方式
//兼容性差
ServletContext application1 = request.getServletContext();
//麻烦,但兼容性好
HttpSession session = request.getSession();
ServletContext application2 = session.getServletContext();
//从父类中继承,兼容性好
ServletContext application3 = super.getServletContext();
ServletContext application4 = super.getServletConfig().getServletContext();

JSP动作元素

在body里面写,语法


静态引入和动态引入的区别

  • 动态引入指的是标签jsp:include,静态引入指的是指令include
  • 静态引入是先把页面包含进来再翻译成一个java代码,动态引入是先大欧编译成java代码,再将内容进行包含
  • 如果是静态页面(HTML),就适合用静态引入include;如果是动态引入(jsp),就用jsp:include;

EL表达式

EL可以获取四大作用域中的共享数据,获取到值就直接打印输出,没有获取不会输出NULL值,而是直接跳过



${name}
${age}

image.png

具体使用

之前我们用jsp的表达式从作用域里面拿到值,并且判断为空,为了防止出现显示为NULL的写法


EL可以替代之前的部分写法,如:




${msg}

    账号:
    密码:
    

不同域中取值

不同域中有相同的名字,取值过程是作用域从小到大,为了让他们显示全,需要在值前面加上指定作用域,最小的作用域不用添加指定作用域(不然会页面错误)






${age}
${requestScope.age}
${sessionScope.age}
${applicationScope.age}

EL的其他作用

  • EL算术运算符

    (1) 1+2{1+2} 1+2{2-1} 2∗3{2*3} 2∗3{16/5}

  • EL关系运算符

    (1) 16>5或{16>5} 或 16>5或{16 gt 5}

    (2) 16=5或{16 ge 5}

    (4) 16

上一篇 springboot第39集:哪吒小哥,靠一个微服务拿下后端
下一篇 编译原理第一周