栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA

第九周结束了,下周就开始做起一个商城实战项目了,这周学习了Servlet与JSP后,前后端以及数据库可以联动起来,感觉有趣多了,但是难度也是骤然上升。前两周学的JDBC刚开始都想不起如何使用了,写了两次之后才开始稍微熟练一些,在下周做项目的时候相信也会再次巩固一下。

DAY_43 关于C/S架构与B/S架构:

C/S和B/S是软件发展过程中出现的两种软件架构方式。

C/S架构(Client/Server 客户端/服务器)

  • 特点:必须在客户端安装特定软件

  • 优点:图形效果显示较好(如:3D游戏)

  • 缺点:服务器的软件和功能进行升级,客户端也必须升级、不利于维护

  • 常见的C/S程序:QQ、微信等

B/S架构(Browser/Server 浏览器/服务器)

  • 特点:无需安装客户端,任何浏览器都可直接访问

  • 优点:涉及到功能的升级,只需要升级服务器端

  • 缺点:图形显示效果不如C/S架构

  • 需要通过HTTP协议访问

关于服务器

什么是Web

Web(World Wide Web) 称为万维网,简单理解就是网站,它用来表示Internet主机上供外界访问的资源。

Internet上供外界访问的资源分为两大类

  • 静态资源:指Web页面中供人们浏览的数据始终是不变的。(HTML、CSS)

  • 动态资源:指Web页面中供人们浏览的数据是由程序产生的,不同时间点,甚至不同设备访问Web页面看到的内容各不相同。(JSP/Servlet)

  • 在Java中,动态Web资源开发技术我们统称为Java Web。

 什么是Web服务器

Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问。

Tomcat的目录结构

文件夹说明备注
bin该目录下存放的是二进制可执行文件startup.bat启动Tomcat、shutdown.bat停止Tomcat
conf这是一个非常重要的目录,这个目录下有两个最为重要的文件server.xml和web.xmlserver.xml:配置整个服务器信息。例如修改端口号,编码格式等。 web.xml:项目部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。
libTomcat的类库,里面存放Tomcat运行所需要的jar文件。
logs存放日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,异常也会记录在日志文件中。
tempTomcat的临时文件,这个目录下的东西在停止Tomcat后删除。
webapps存放web项目的目录,其中每个文件夹都是一个项目;其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。
work运行时生成的文件,最终运行的文件都在这里。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。
Servlet概念
  • Servlet:Server Applet的简称,是服务器端的程序(代码、功能实现),可交互式的处理客户端发送到服务端的请求,并完成操作响应。

  • 动态网页技术

  • JavaWeb程序开发的基础,JavaEE规范(一套接口)的一个组成部分。

Servlet的作用

  • 接收客户端请求,完成操作。

  • 动态生成网页(页面数据可变)。

  • 将包含操作结果的动态网页响应给客户端。

编写Servlet

  • 实现javax.servlet.Servlet

  • 重写5个主要方法

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;

public class MyServlet implements Servlet{
	public void init(ServletConfig config) throws ServletException{
	}
    
	public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
		System.out.println("My First Servlet!");
	}
    
	public void destroy(){
	
	}
    
	public ServletConfig getServletConfig(){
		return null;	
	}	
    
	public String getServletInfo(){
		return null;
	}
}

配置Servlet

编写WEB-INF下项目配置文件web.xml



  	
  
  
  	my
    MyServlet
  
  
  
  	my
  	/myservlet
  
  
HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状态的、应用层的协议,运行于TCP协议基础之上。

HTTP协议特点

  • 支持客户端(浏览器)/服务器模式。

  • 简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快。请求方法常用的有GET、POST等。

  • 灵活:HTTP允许传输任意类型的数据,传输的数据类型由Content-Type标识。

  • 无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户的请求后,即断开连接。采用这种方式可以节省传输时间。

    • HTTP1.0版本是一个请求响应之后,直接就断开了。称为短连接。

    • HTTP1.1版本不是响应后直接就断开了,而是等几秒钟,这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连接。

  • 无状态:HTTP协议是无状态协议。

    • 无状态是指协议对于事务处理没有记忆能力。

HTTP协议通信流程

  • 客户与服务器建立连接(三次握手)。

  • 客户向服务器发送请求。

  • 服务器接受请求,并根据请求返回相应的文件作为应答。

  • 客户与服务器关闭连接(四次挥手)。

Servlet核心接口和类

在Servlet体系结构中,除了实现Servlet接口,还可以通过继承GenericServlet 或 HttpServlet类,完成编写。

Servlet核心接口和类

在Servlet体系结构中,除了实现Servlet接口,还可以通过继承GenericServlet 或 HttpServlet类,完成编写。

Servlet接口

在Servlet API中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。 该接口包括以下五个方法:

  • init(ServletConfig config)

  • ServletConfig getServletConfig()

  • service(ServletRequest req,ServletResponse res)

  • String getServletInfo()

  • destroy( )

GenericServlet抽象类

GenericServlet 使编写 Servlet 变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 Servlet,只需重写抽象 service 方法即可。

HttpServlet类

HttpServlet是继承GenericServlet的基础上进一步的扩展。 提供将要被子类化以创建适用于 Web 站点的 HTTP servlet 的抽象类。HttpServlet 的子类至少必须重写一个方法,该方法通常是以下这些方法之一: doGet,如果 servlet 支持 HTTP GET 请求 doPost,用于 HTTP POST 请求 doPut,用于 HTTP PUT 请求 doDelete,用于 HTTP DELETE 请求

Servlet两种配置方式

  • 使用web.xml(Servlet2.5之前使用)
  • 使用注解
Servlet应用

request对象

在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象

get和post区别

get请求

  • get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连

  • get方式明文传递,数据量小,不安全

  • 效率高,浏览器默认请求方式为GET请求

  • 对应的Servlet的方法是doGet

post请求

  • post方法是把提交的数据放在HTTP包的Body中

  • 密文传递数据,数据量大,安全

  • 效率相对没有GET高

  • 对应的Servlet的方法是doPost

request主要方法

方法名说明
String getParameter(String name)根据表单组件名称获取提交数据
void setCharacterEncoding(String charset)指定每个请求的编码

response对象

response对象用于响应客户请求并向客户端输出信息。

response主要方法

方法名称作用
setHeader(name,value)设置响应信息头
setContentType(String)设置响应文件类型、响应式的编码格式
setCharacterEncoding(String)设置服务端响应内容编码格式
getWriter()获取字符输出流

解决乱码问题

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

DAY_44

转发

转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理。

页面跳转

在调用业务逻辑的Servlet中,编写以下代码

  • request.getRequestDispatcher("/目标URL-pattern").forward(request, response);

数据传递

forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据

  • request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)

    • 可以将数据存入request后,在一次请求过程中的任何位置进行获取

    • 可传递任何数据(基本数据类型、对象、数组、集合等)

  • 存数据:request.setAttribute(key,value);

    • 以键值对形式存储在request作用域中。key为String类型,value为Object类型

  • 取数据:request.getAttribute(key);

    • 通过String类型的key访问Object类型的value

转发特点

  • 转发是服务器行为

  • 转发是浏览器只做了一次访问请求

  • 转发浏览器地址不变

  • 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递、

  • 转发只能将请求转发给同一个Web应用中的组件

重定向

重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。

页面跳转

在调用业务逻辑的Servlet中,编写以下代码

  • response.sendRedirect("目标URI");

数据传递

sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求

  • response没有作用域,两次request请求中的数据无法共享

  • 传递数据:通过URI的拼接进行数据传递("/WebProject/b?username=tom");

  • 获取数据:request.getParameter("username");

重定向特点

  • 重定向是客户端行为。

  • 重定向是浏览器做了至少两次的访问请求。

  • 重定向浏览器地址改变。

  • 重定向两次跳转之间传输的信息会丢失(request范围)。

  • 重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序中的资源、其他站点的资源。

转发、重定向总结

当两个Servlet需要传递数据时,选择forward转发。不建议使用sendRedirect进行传递

Servlet执行流程

线程安全问题

Servlet在访问之后,会执行实例化操作,创建一个Servlet对象。而我们Tomcat容器可以同时多个线程并发访问同一个Servlet,如果在方法中对成员变量做修改操作,就会有线程安全的问题。

如何保证线程安全

  • synchronized

    • 将存在线程安全问题的代码放到同步代码块中

  • 实现SingleThreadModel接口

    • servlet实现SingleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题,但是servlet响应客户端请求的效率太低,所以已经淘汰。

  • 尽可能使用局部变量

cookie的使用
  • cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。

  • 一旦Web浏览器保存了某个cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个cookie回传给Web服务器。

  • 一个cookie主要由标识该信息的名称(name)和值(value)组成。

创建cookie

        //创建cookie
		cookie ck=new cookie("code", code);
		ck.setPath("/webs");//设置cookie的路径
		ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0立马销毁;<0内存存储,默认-1
		response.addcookie(ck);//添加到response对象中,响应时发送给客户端
        //注意:有效路径: 当前访问资源的上一级目录,不带主机名

获取cookie

//获取所有的cookie
cookie[] cks=request.getcookies();
		//遍历cookie
		for(cookie ck:cks){
          //检索出自己的cookie
			if(ck.getName().equals("code"))
			{
              //记录cookie的值
				code=ck.getValue();
				break;
			}
		}

修改cookie

只需要保证cookie的名和路径一致即可修改

	//修改cookie
    cookie ck=new cookie("code", code);
    ck.setPath("/webs");//设置cookie的路径
    ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
    response.addcookie(ck);//让浏览器添加cookie

cookie编码与解码

cookie默认不支持中文,只能包含ASCII字符,所以cookie需要对Unicode字符进行编码,否则会出现乱码。

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法

  • 解码使用java.net.URLDecoder类的decode(String str,String encoding)方法

cookie优点和缺点

优点

  • 可配置到期规则。

  • 简单性:cookie 是一种基于文本的轻量结构,包含简单的键值对。

  • 数据持久性:cookie默认在过期之前是可以一直存在客户端浏览器上的。

缺点

  • 大小受到限制:大多数浏览器对 cookie 的大小有 4K、8K字节的限制。

  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收 cookie 的能力,因此限制了这一功能。、

  • 潜在的安全风险:cookie 可能会被篡改。会对安全性造成潜在风险或者导致依赖于cookie 的应用程序失败。

Session概述
  • Session用于记录用户的状态。Session指的是在一段时间内,单个客户端与Web服务器的一连串相关的交互过程。

  • 在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。

Session原理

  • 服务器会为每一次会话分配一个Session对象

  • 同一个浏览器发起的多次请求,同属于一次会话(Session)

  • 首次使用到Session时,服务器会自动创建Session,并创建cookie存储SessionId发送回客户端

Session使用

  • Session作用域:拥有存储数据的空间,作用范围是一次会话有效

    • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话

    • 可以将数据存入Session中,在一次会话的任意位置进行获取

    • 可传递任何数据(基本数据类型、对象、集合、数组)

获取Session

session是服务器端自动创建的,通过request对象获取

        //获取Session对象
		HttpSession session=request.getSession();
		System.out.println("Id:"+session.getId());//唯一标记,

Session保存数据

setAttribute(属性名,Object)保存数据到session中

session.setAttribute("key",value);//以键值对形式存储在session作用域中。

Session获取数据

getAttribute(属性名);获取session中数据

session.getAttribute("key");//通过String类型的key访问Object类型的value

Session移除数据

removeAttribute(属性名);从session中删除数据

session.removeAttribute("key");//通过键移除session作用域中的值

Session与Request应用区别

  • request是一次请求有效,请求改变,则request改变

  • session是一次会话有效,浏览器改变,则session改变

ServletContext概述
  • 全局对象,也拥有作用域,对应一个Tomcat中的Web应用

  • 当Web服务器启动时,会为每一个Web应用程序创建一块共享的存储区域(ServletContext)。

  • ServletContext在Web服务器启动时创建,服务器关闭时销毁。

获取ServletContext对象

  • GenericServlet提供了getServletContext()方法。(推荐) this.getServletContext();

  • HttpServletRequest提供了getServletContext()方法。(推荐)

  • HttpSession提供了getServletContext()方法。

ServletContext作用

获取项目真实路径

获取当前项目在服务器发布的真实路径

String realpath=servletContext.getRealPath("/");

获取项目上下文路径

获取当前项目上下文路径(应用程序名称)

System.out.println(servletContext.getContextPath());//上下文路径(应用程序名称)
System.out.println(request.getContextPath());

全局容器

ServletContext拥有作用域,可以存储数据到全局容器中

  • 存储数据:servletContext.setAttribute("name",value);

  • 获取数据:servletContext.getAttribute("name");

  • 移除数据:servletContext.removeAttribute("name");

ServletContext特点

  • 唯一性: 一个应用对应一个ServletContext。

  • 生命周期: 只要容器不关闭或者应用不卸载,ServletContext就一直存在。


DAY_45 过滤器
  • 执行地位在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter

  • 可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)

编写过滤器

Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)

实现过程

  • 编写Java类实现Filter接口

  • 在doFilter方法中编写拦截逻辑

  • 设置拦截路径

package com.qf.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/myservlet1")//过滤路径
public class MyFilter1 implements Filter {

    //初始化过滤器
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化了........init...  "+filterConfig);
    }

    //执行过滤
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("过滤前........doFilter ");
        //放行
        chain.doFilter(request, response);

        System.out.println("过滤后.......doFilter");

    }

    //销毁
    @Override
    public void destroy() {
        System.out.println("销毁了.....destroy");
    }
}

过滤器配置

注解配置

在自定义的Filter类上使用注解@WebFilter(value=“/过滤目标资源”)

xml配置

  
  
    sf
    
    com.qf.web.filter.SecondFilter
  
 
  
     
    sf
     
    /*
  

过滤器路径

过滤器的过滤路径通常有三种形式:

精确过滤匹配 ,比如/index.jsp   /myservlet1

后缀过滤匹配,比如*.jsp、*.html、*.jpg

通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配。
    /aaa/bbb/* 允许

过滤器链和优先级

过滤器链

客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过滤器),那么这组过滤器就称为一条过滤器链。

每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

过滤器优先级

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 优先级:

  • 如果为注解的话,是按照类全名称的字符串顺序决定作用顺序

  • 如果web.xml,按照 filter-mapping注册顺序,从上往下

  • web.xml配置高于注解方式

  • 如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次。

过滤器典型应用

  • 过滤器解决编码
  • 权限验证

DAY_46 JSP

概念

简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页

作用

替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)

创建JSP

在web目录下新建*.jsp文件(与WEB-INF平级)

JSP编写Java代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    This is my first page


    <%=new java.util.Date() %>

JSP与Servlet

  • 关系

    • JSP文件在容器中会转换成Servlet执行。

    • JSP是对Servlet的一种高级封装。本质还是Servlet。

  • 区别

    • 与 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。

JSP实现原理

Tomcat会将xxx.jsp转换成Java代码,进而编译成.class文件运行,最终将运行结果通过response响应给客户端。

JSP.java源文件存放目录

使用IDEA开发工具,Tomcat编译后的JSP文件(Xxx_jsp.class 和 Xxx_jsp.java)的存放地点:

  • C:用户账户名.IntelliJIdea2019.1systemtomcat项目名称workCatalinalocalhost应用上下文orgapachejsp

JSP与HTML集成开发

脚本

脚本可以编写Java语句、变量、方法或表达式。

普通脚本

语法:<% Java代码 %>

注意事项:

  • 普通脚本可以使用所有java语法,除了定义函数
  • 脚本与脚本之间不可嵌套,脚本与html标签不可嵌套

输出脚本

语法:<%=Java表达式 %>

  • 输出脚本可以输入带有返回值的函数
  • 输出脚本中不可加;号
JSP指令

JSP指令用来设置与整个JSP页面相关的属性。

指令描述
<%@ page ... %>定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %>包含其他文件
<%@ taglib ... %>引入标签库的定义,可以是自定义标签

page指令

  • 语法:<%@ page attribute1="value1" attribute2="value2" %>

  • Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。

属性描述
contentType指定当前JSP页面的MIME类型和字符编码格式
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
import导入要使用的Java类
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session。默认为true立即创建,false为使用时创建
pageEncoding指定JSP页面的解码格式

include指令

  • 语法:<%@ include file = "被包含的JSP路径"%>

  • 通过include指令来包含其他文件。

  • 被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)。

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

taglib指令

  • 语法:<%@ taglib uri="外部标签库路径" prefix="前缀" %>

  • 引入JSP的标准标签库

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

动作标签

  • 语法:

  • 动作标签指的是JSP页面在运行期间的命令

include

  • 语法:

  • 动作元素会将外部文件输出结果包含在JSP中(动态包含)。

属性描述
page包含在页面中的相对URL地址。
内置对象

由JSP自动创建的对象,可以直接使用

对象名类型说明
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
sessionjavax.servlet.http.HttpSession由session=“true”开关
applicationjavax.servlet.ServletContext
configjavax.servlet.ServletConfig
exceptionjava.lang.Throwable由isErrorPage=“false”开关
outjavax.servlet.jsp.JspWriterjavax.servlet.jsp.JspWriter
pageContextjavax.servlet.jsp.PageContext
pagejava.lang.Object当前对象this当前servlet实例

四大域对象

JSP有四大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别

  • pageContext (javax.servlet.jsp.PageContext) 当前JSP页面范围

  • request (javax.servlet.http.HttpServletRequest) 一次请求有效

  • session (javax.servlet.http.HttpSession) 一次会话有效(关闭浏览器失效)

  • application (javax.servlet.ServletContext) 整个Web应用有效(服务器重启或关闭失效)

pageContext 对象

  • pageContext对象是javax.servlet.jsp.PageContext 类的实例,拥有作用域,用来代表整个JSP页面。

  • 当前页面的作用域对象,一旦跳转则失效

  • 通过setAttribute("name",value);存储值

  • 通过getAttribute("name");获取值

  • 用于获取其他8个内置对象或者操作其他对象的作用域

pageContext操作其他内置对象的作用域

pageContext对象可以操作其他作用域存储和获取。

<%
	//操作其他作用域存储
	pageContext.setAttribute("name",value);//当前页面有效
	pageContext.setAttribute("name",value,PageContext.REQUEST_SCOPE);//request作用域
	pageContext.setAttribute("name",value,PageContext.SESSION_SCOPE);//session作用域
	pageContext.setAttribute("name",value,PageContext.APPLICATION_SCOPE);//application作用域

%>

<%
	//操作其他作用域获取
    pageContext.getAttribute("name");//当前页面作用域
    pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域
    pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域
    pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application作用域
    pageContext.findAttribute("name");//从pageContext,request ,session ,application依次查找
%>

DAY_47 EL表达式(expression Language)

概念

EL使JSP写起来更简单、简洁。主要用于获取作用域中的数据

作用

用于替换作用域对象.getAttribute("name");

EL的应用(获取基本类型、字符串)

  • ${scope.name} 获取具体某个作用域中的数据

  • ${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)

EL和JSP脚本的区别

  • <%=request.getAttribute() %> 没有找到返回null

  • ${requestScope.name} 没找到返回""

EL的应用(获取引用类型)

使用EL获取作用域中的对象调用属性时,只能访问对象的get方法,必须遵守命名规范定义

<%
    Emp e = new Emp();
    e.setName("gavin");
    e.setAge(19);
    request.setAttribute("e",e);
%>
${requestScope.e.name}<%-- 调用getName()方法 --%>

EL的应用(获取数组、集合的元素)

EL可以获取Array、List、Map中的元素,Set由于没下标,无法直接访问元素,可遍历

EL的运算符

操作符描述
.访问一个Bean属性或者一个映射条目
[]访问一个数组或者链表的元素
+
-减或负
*
/ or div
% or mod取模
== or eq测试是否相等
!= or ne测试是否不等
< or lt测试是否小于
> or gt测试是否大于
<= or le测试是否小于等于
>= or ge测试是否大于等于
&& or and测试逻辑与
|| or or测试逻辑或
! or not测试取反
empty测试是否空值

empty关键字

<% 
	String s1="";
    pageContext.setAttribute("s1", s1);
    List list1 =new ArrayList();
    pageContext.setAttribute("list1", list1);
%>

${empty s1}
${empty list1}

隐式对象

EL 表达式语言定义了11个隐式对象

隐含对象描述
pageScopepage 作用域
requestScoperequest 作用域
sessionScopesession 作用域
applicationScopeapplication 作用域
paramRequest 对象的参数,字符串
paramValuesRequest对象的参数,字符串集合
headerHTTP 信息头,字符串
headerValuesHTTP 信息头,字符串集合
initParam上下文初始化参数
cookiecookie值
pageContext当前页面的pageContext
JSTL标准标签库

现有问题

  • EL主要是用于作用域获取数据,虽然可以做运算判断,但是得到的都是一个结果,做展示。

  • EL不存在流程控制。比如判断。

  • EL对于集合只能做单点访问,不能实现遍历操作。比如循环。

什么是 JSTL?

  • JSTL:全称Java Server Pages Standard Tag Library

  • JSP标准标签库(JSTL)是一个JSP标签集合。

JSTL的作用

  • 可对EL获取到的数据进行逻辑操作。

  • 与EL合作完成数据的展示。

JSTL使用

  • 导入两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下

  • 在JSP页面引入标签库<% @taglib uri="Oracle Java Technologies | Oracle" prefix="c">

核心标签

条件标签if判断

语法: < /c:if>

多条件choose判断

语法:

结果1< /c:when>

结果2< /c:when>

结果3< /c:when>

结果4< /c:otherwise>

< /c:choose>

迭代foreach标签

语法:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/658998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号