spring更新中

Java web

javaEE的三大组件:servlet、Filter、Listener

重要的知识点:

访问静态资源、文件的上传下载

待更新

Servlet

Servlet 是什么?

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:

  • 性能明显更好。
  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
  • Servlet 是独立于平台的,因为它们是用 Java 编写的。
  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

Servlet 架构

下图显示了 Servlet 在 Web 应用程序中的位置。

Servlet 架构

浏览器访问servlet的过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLff5UbO-1572800687922)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\浏览器访问servlet的过程.png)]

需要注意的是,在web服务器运行阶段每个Servlet都只会创建一个实例对象。然而,每次HTTP请求,Web服务器都会用所请求Servlet实例的service(HttpServletRequestrequest,HttpServletResponse response)方法,重新创建一个request对象和一个response对象。

Servlet 任务

Servlet主要的作用是处理客户端请求,并像客户端做出响应。

Servlet 执行以下主要任务:

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

Servlet 创有三种方式。

1、实现 Servlet 接口

2、继承 GenericServlet 类

3、继承 HttpServlet 方法

Servlet工作过程:

请求和响应

HttpServletResponse对象

在ServletAPI中.定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTT响应信息。由于HTTP应消息分为状态行,响应消息头.消息体三部分,因此,在HttpServtetResponse接口中定义了向客户发送响应状态码,响应消息头.响应消息体的方法。

发送状态码相关的方法

setStatus(intstatus)方法

该方法用于设置HTTP应消息的状态码·并生成响应状态行。由于响应状态行中的状态描述信息直接与状态相关.而HTTP版本由服务器确定,因此,只要通过setStatus(intstatus)方法设置了状态码,即可实现状态行的发送。需要注意的是.正常情况下,Web服务器会默认产生一个状态码为200的状态行

sendError(int sc)方法

该方法用于发送表示错误信息的状态码,例如404状态表示找不到客户请求的资源

发送响应消息头相关的方法

当Servlet向客户发送应消息时。由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DlDkw7ws-1572800687940)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\设置响应头字段的方法.png)]

列举的一系列方法中,addHeader()、setHeader()、addintHeader()方法都是用于设各种头段,而setContentType()、setLocale()和setCharacterEncoding()方法用于设置字符生码.这些设置字符编码的方法可以有效解决乱码问题

发送响应消息体相关的方法()-用于输出

由于在HTTP应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循io流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法

getOutputStream()方法

需要输出二进制格式的响应正文则使用getOutputStream()方法。

getOutputStream()方法所获取的字节流输出对象为ServletOutputStream类型,ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。

getWriter()方法

该方法所获取的字符出对象为PrintWriter类型由于PrintWnter类的对象可以直接输出字符文本内容.因此.要想输出内容全为字符文本的网页文档,要使用getWriter()方法

public class PrintServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, 
        HttpServletResponse response)throws ServletException, IOException {
		    String data = "itcast";
		    // 获取字节输出流对象
//			OutputStream out = response.getOutputStream();
//			out.write(data.getBytes());// 输出信息
			//使用getWriter()方法发送消息体
			PrintWriter print = response.getWriter(); 
			print.write(data); // 输出信息

			
		}
		public void doPost(HttpServletRequest request, 
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

HttpServletResponse应用

  • 解决中文乱码
//response.setCharacterEncoding("utf-8");
//设置字符编码
response.setContentType("text/html;charset=utf-8");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zobf59Nh-1572800687953)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\解决中文乱码的方式.png)]

为了使代码更简洁,通常使用第二种方式。

  • 实现网页定时刷新并跳转
public class RefreshServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,
        HttpServletResponse response)throws ServletException, IOException {
		// 2秒后刷新并跳转到传智播客官网首页
		response.setHeader("Refresh", "2;URL=http://www.itcast.cn");
		// 每隔3秒定时刷新当前页面
		//response.setHeader("Refresh", "3");
		response.getWriter().println(new java.util.Date());// 输出当前时间

		}
		public void doPost(HttpServletRequest request,
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}
  • 实现重定向

HttpServletResponse 接口定义了一个sendRedirect()

该方法用于生成302响应码和Localtion响应头,从而通知客户端重新访问Localtion响应头中指定的URL。

public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,
        HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		// 用HttpServletRequest对象的getParameter()方法获取用户名和密码
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			// 假设用户名和密码分别为:itcast和123
			if (("itcast").equals(username) &&("123").equals(password)) {
				// 如果用户名和密码正确,重定向到 welcome.html
	              response.sendRedirect("/chapter04/welcome.html");
			} else {
				// 如果用户名和密码错误,重定向到login.html
				response.sendRedirect("/chapter04/login.html");
			}
		}
		public void doPost(HttpServletRequest request, 
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

HttpServletRequest 对象

在ServletAPI中,定义了一个HttpServletRequest接囗,它继承自ServietRequest接口,专门用来封装HTTP请求洎息。由于HTTP请求消息分为请求行、请求消息头和请求消息体3部分。因此.在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。

获请求行信息的相关方法

当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名.请求路怿等信息。为了获取这些信息,在HttpServletRequest接口中·定义了一系列用于获取请求行的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFD9jVxC-1572800687955)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\获取请求行的相关方法.png)]

获请求消息头的相关方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GACMWKvZ-1572800687963)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\获取请求信息头的相关方法.png)]
public class RequestHeadersServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,
        HttpServletResponse response)throws ServletException, IOException {
			response.setContentType("text/html;charset=utf-8");
			PrintWriter out = response.getWriter();
	         // 获取请求消息中所有头字段
			Enumeration headerNames = request.getHeaderNames();
			// 使用循环遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
			while (headerNames.hasMoreElements()) {
				String headerName = (String) headerNames.nextElement();
				out.print(headerName + " : "
	                       + request.getHeader(headerName)+ "<br>");
			}
		}
		public void doPost(HttpServletRequest request,
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

利用请求消息头防止“盗链”

public class DownManagerServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, 
        HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
	         // 获取referer头的值
			String referer = request.getHeader("referer"); 
	         // 获取访问地址
			String sitePart = "http://" + request.getServerName();
			// 判断referer头是否为空,这个头的首地址是否以sitePart开始的
			if (referer != null && referer.startsWith(sitePart)) {
				// 处理正在下载的请求
				out.println("dealing download ...");
			} else {
				// 非法下载请求跳转到download.html页面
				RequestDispatcher rd = request
						.getRequestDispatcher("/download.html");
				rd.forward(request, response);
			}
		}
		public void doPost(HttpServletRequest request,
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

HttpServletRequest的应用

获取请求参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJZk9btl-1572800687965)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\获取请求参数的方法.png)]

解决请求参数的中文乱码问题

		//设置request对象的解码方式
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("username");
		name=new String(name.getBytes("iso8859-1"),"utf-8");
通过Request对象传递数据
  • setAttribute()方法

该方法用于一个对象与一个名称关ServletRequest对象中

若对象已经存在指定名称的属性,则删除原来的属性,添加新的属性

若传递给setAttribute()方法的属性值对象为null,则删除指定名称的属性,此时作用等同removeAttribute()

  • getAttribute()方法

用于从ServletRequest对象中返回指定名称的属性

  • removeAttribute()方法

用于从ServletRequest对象中删除指定名称的属性

  • getAttributeNames()方法

用于返回一个包含ServletRequest对象中所有属性名的Enumerration对象,在此基础上,可以对ServletRequest对象中的所有属性进行遍历处理。

ps:只有属于同一个请求的数据才可以通过ServletRequest对象传递数据

RequestDispatcher对象的应用

RequestDispatcher接口

获取RequestDispatcher对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkJUH1og-1572800687970)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\获取RequestDispatcher对象的方法.png)]

通知其他Web资源处理当前的Servlet请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFWj2Mu1-1572800687972)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\RequestDispatcher接口的方法.png)]

forward()实现请求转发

include()实现请求包含

请求转发
public class RequestForwardServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,
        HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		// 将数据存储到request对象中
			request.setAttribute("company", "北京传智播客教育有限公司");
			RequestDispatcher dispatcher = request
					.getRequestDispatcher("/ResultServlet");
			dispatcher.forward(request, response);
		}
		public void doPost(HttpServletRequest request,
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

转发后获取设置的company属性以验证转发是否来自RequestForwardServlet

public class ResultServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,
        HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
          // 获取PrintWriter对象用于输出信息
			PrintWriter out = response.getWriter();
			// 获取request请求对象中保存的数据
			String company = (String) request.getAttribute("company");
			if (company != null) {
				out.println("公司名称:" + company + "<br>");
			}
		}
		public void doPost(HttpServletRequest request, 
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}
请求包含

与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息

public class IncludingServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, 
        HttpServletResponse response)throws ServletException, IOException {
		//如果这里不设置响应的编码格式,即使请求包含的资源设置了,也会出现乱码
        //因为此时HttpServletResponse对象已经创建,编码时默认采用ISO-8859-1
        //当客户端解码时会继续调用HttpServletResponse对象中的信息
        response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		RequestDispatcher rd = request
					.getRequestDispatcher("/IncludedServlet?p1=abc");
			out.println("before including" + "<br>");
			rd.include(request, response);
			out.println("after including" + "<br>");
		}
		public void doPost(HttpServletRequest request,
	        HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

请求包含

public class IncludedServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, 
        HttpServletResponse response)throws ServletException, IOException {
		// 设置响应时使用的字符编码
	    response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.println("中国" + "<br>");
		out.println("URI:" + request.getRequestURI() + "<br>");
		out.println("QueryString:" + request.getQueryString() + "<br>");
		out.println("parameter p1:" + 
                       request.getParameter("p1") + "<br>");
	}
	public void doPost(HttpServletRequest request,
        HttpServletResponse response)throws ServletException, IOException {
		doGet(request, response);
	}
}

页面显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Y2PXCwh-1572800687979)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\请求包含的结果显示.png)]

重点

乱码解决
		//设置request对象的解码方式
		//1.设置请求的编码格式为utf-8
		request.setCharacterEncoding("utf-8");
		//2.获得属性,设置解码格式
		String name = request.getParameter("username");
		name=new String(name.getBytes("iso8859-1"),"utf-8");
		
		//设置response的编码方式
        //response.setCharacterEncoding("utf-8");
        //设置字符编码
        response.setContentType("text/html;charset=utf-8");
转发、重定向、包含
//转发
RequestDispatcher rd = request.getRequestDispatcher("/download.html");
rd.forward(request, response);
//包含(请求包含指的是使用include()方法将Servlet请求转发给其他web资源进行处理,与转发不同的是,它既包含当前servlet的响应信息,也包含其他web资源做出的响应信息)
PrintWriter out = response.getWriter();
RequestDispatcher rd = request.getRequestDispatcher("/IncludedServlet?p1=abc");
out.println("before including" + "<br>");
rd.include(request, response);
out.println("after including" + "<br>");
//重定向
response.sendRedirect("/chapter04/login.html");

前后端传递数据

cookie && seesion

cookie

用于标识用户的身份,存储在客户端,最大4096个字符。

cookie类的构造方法,有且只有一个

public Cookie(java.lang.String name,java.lang.String value)

name 指定cookie的名称, value指定cookie的值

cookie一旦创建,其名称不可变,值允许被修改

cookie类的常用方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GS884hRw-1572800687981)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\cookie类的常用方法.png)]

setPath(String url)和getPath()

针对cookie的Path属性,如果cookie创建时没有设置Path属性,邢么该Cookie只对当前访问路径所属的目录及其子目录有效。如果想让某个Cookie项对站点的所有目录下的访问路径都效,应调用Cookie对象的setPath()方法将其Path属性设置为"/".

setDomain(String pattern)和getDomain()

针对cookie的domain属性。domain属性用于指定浏览器访问的域。如,百度的域为"baidu.com"

设置domain属性是,其值必须以"."开头 。如,domain = “.baidu.com”

默认情况下,domain属性的值为当前的主机名,浏览器访问当前主机下的资源时,都会将Cookie信息返回给服务器。

ps:domain属性的值时不区分大小写的

public class LastAccessServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   public void doGet(HttpServletRequest request, 
	                        HttpServletResponse response)
				throws ServletException, IOException {
			// 指定服务器输出内容的编码方式UTF-8,防止发生乱码
			response.setContentType("text/html;charset=utf-8");
			String lastAccessTime = null;
	         // 获取所有的cookie,并将这些cookie存放在数组中
			Cookie[] cookies = request.getCookies();
			// 遍历cookies数组
			for (int i = 0; cookies != null && i < cookies.length; i++) {
				if ("lastAccess".equals(cookies[i].getName())) {
					// 如果cookie的名称为lastAccess,则获取该cookie的值
					lastAccessTime = cookies[i].getValue();
					break;
				}
			}
			// 判断是否存在名称为lastAccess的cookie
			if (lastAccessTime == null) {
				response.getWriter().print("您是首次访问本站!!!");
			} else {
			     response.getWriter().print("您上次的访问时间是: " 
	                           + lastAccessTime);
			}
			// 创建cookie,将当前时间作为cookie的值发送给客户端
			String currentTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
					.format(new Date());
			Cookie cookie = new Cookie("lastAccess",currentTime);
			//cookie.setMaxAge(60*60); //设置cookie最大存在时间
			// 发送 cookie
			response.addCookie(cookie);
		}
	    public void doPost(HttpServletRequest req, HttpServletResponse resp)
				throws ServletException, IOException {
			this.doPost(req, resp);
		}
	}

seesion

用于标识用户的身份,存储在服务端

session的构造方法
public HttpSession getSession()
public HttpSession getSession(boolean create) 
参数为true,HttpSession对象不存在时创建并返回新的HttpSession对象。false,不会创建新的HttpSession对象,返回null
无参构造函数相当于true的情况
    
HttpSession session = req.getSession();

HttpSession的一些常用方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9iUOm4zc-1572800687983)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\HttpSession的一些常用方法_1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DkFiNwpy-1572800687986)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\java_web_images\HttpSession的一些常用方法_2.png)]

通常使用cookie保存session的id

jsp

什么是jsp

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

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

jsp的优点

  • 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
  • 服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。
  • JSP 基于Java Servlet API,因此,JSP拥有各种强大的企业级Java API,包括JDBC,JNDI,EJB,JAXP等等。
  • JSP页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被Java servlet 模板引擎所支持。

最后,JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。

JSP带来的其他好处:

  • 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。
  • 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
  • 与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
  • 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
  • 与静态HTML相比:静态HTML不包含动态信息。

jsp运行原理&生命周期

理解JSP底层功能的关键就是去理解它们所遵守的生命周期。

JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。

以下是JSP生命周期中所走过的几个阶段:

  • 编译阶段:

    servlet容器编译servlet源文件,生成servlet类

  • 初始化阶段:

    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

  • 执行阶段:

    调用与JSP对应的servlet实例的服务方法

  • 销毁阶段:

    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:

img

jsp语法

脚本程序的语法格式:

<% 代码片段 %>

等价的XML语句

<jsp:scriptlet>
   代码片段
</jsp:scriptlet>

JSP表达式的语法格式:

<%= 表达式 %>

等价的XML语句

<jsp:expression>
   表达式
</jsp:expression>

jsp隐式对象

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

JSP所支持的九大隐式对象:

对象描述
requestHttpServletRequest 接口的实例
responseHttpServletResponse 接口的实例
outJspWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关
configServletConfig类的实例
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page类似于Java类中的this关键字
ExceptionException类的对象,代表发生错误的JSP页面中对应的异常对象

JSP 标准标签库(JSTL)

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。

  • 核心标签
  • 格式化标签
  • SQL 标签
  • XML 标签
  • JSTL 函数

核心标签

核心标签是最常用的 JSTL标签

标签描述
<c:out>用于在 JSP 中显示数据,就像 <%= …>
<c:set>用于保存数据
<c:remove>用于删除数据
<c:catch>用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if>与我们在一般程序中用的 if 一样
<c:choose>本身只当做 <c:when > 和 < c:otherwise > 的父标签
<c:when><c:choose > 的子标签,用来判断条件是否成立
<c:otherwise><c:choose > 的子标签,接在 < c:when > 标签后,当 < c:when > 标签判断为 false 时被执行
<c:import>检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach>基础迭代标签,接受多种集合类型
<c:forTokens>根据指定的分隔符来分隔内容并迭代输出
<c:param>用来给包含或重定向的页面传递参数
<c:redirecr>重定向至一个新的 URL.
<c:url>使用可选的查询参数来创造一个 URL

格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字

标签描述
<fmt:formatNumgber>使用指定的格式或精度格式化数字
<fmt:parseNumber>解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate>使用指定的风格或模式格式化日期和时间
<fmt:pardeDate>解析一个代表着日期或时间的字符串
<fmt:bundle>绑定资源
<fmt:setLocale>指定地区
<fmt:setBundle>绑定资源
<fmt:timeZone>指定时区
<fmt:setTimeZone>指定时区
<fmt:message>显示资源配置文件信息
<fmt:requesEncoding>设置request的字符编码

SQL标签

JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签

标签描述
<sql:setDataSource>指定数据源
<sql:query>运行SQL查询语句
<sql:update>运行SQL更新语句
<sql:param>将SQL语句中的参数设为指定值
<sql:dateParam>将SQL语句中的日期参数设为指定的java.util.Date 对象值
<sql:transaction>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

XML 标签

JSTL XML标签库提供了创建和操作XML文档的标签

在使用xml标签前,你必须将XML 和 XPath 的相关包拷贝至你的<Tomcat 安装目录>\lib下:

  • XercesImpl.jar

    下载地址: http://www.apache.org/dist/xerces/j/

  • xalan.jar

    下载地址: http://xml.apache.org/xalan-j/index.html

标签描述
<x:out>与<%= … >,类似,不过只用于XPath表达式
<x:parse>解析 XML 数据
<x:set>设置XPath表达式
<x:if>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
<x:forEach>迭代XML文档中的节点
<x:choose><x:when >和<x:otherwise >的父标签
<x:when><x:choose >的子标签,用来进行条件判断
<x:ohterwise><x:choose >的子标签,当<x:when >判断为false时被执行
<x:transform>将XSL转换应用在XML文档中
<x:param>与<x:transform >共同使用,用于设置XSL样式表

JSTL函数

JSTL包含一系列标准函数,大部分是通用的字符串处理函数

函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()移除首尾的空白符

JSP 表达式语言(EL)

el表达式的基本语法

${el表达式}

第一种: 访问bean的属性

a. ${user.name}:

​ jsp引擎会依次从pageContext、request、session、application查找绑订名为“user” 的对象,如果找到了,就不再向下查找,否则,继续向下查找。 找到后,调用该对象的getName(),并输出其值;找不到,则输出""(空)。

b. 或者也可以使用${user[“name”]},效果相同

“name” 表示字符串

c. 或者是${user[propname]},注意propname没有引号,表示变量

d. 此外,[ ]里面还可以是0,1…这样的下标,作用是输出数组里的元素值。

e. 可以使用pageScope,requestScope,sessionScope,applicationScope四个关键字指定查找的范围。

f. ${requestScope.user.name}只到request中去找,不再依次到4个范围查找了

第二种: 获得请求参数值

a. ${param.username}

等价于 request.getParameter(“username”);

b. ${paramValues.interest}

等价于request.getParameterValues(“interest”);

第三种: 计算一个表达式,将结果作为标签的属性值或者直接输出

算数运算,关系运算,逻辑运算,empty运算

JSP EL隐含对象

JSP EL支持下表列出的隐含对象:

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值