JSP及EL表达式和JSTL以及MVC的概念

版权声明:未经允许不得随意转载,著作权归__盛某人所有 https://blog.csdn.net/NaXieNianWoMenYiQ/article/details/88076499

在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。

如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。 

对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。

  • JSP的运行原理

         JSP看上去是HTML,但是其本质是Servlet

         JSP 页面的文件扩展名必须为.jsp

WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servletclass类               文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程             序。

WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。

*.jsp  _--- tomcat -- > 编译成  -- > *.java   ----- > *.class 最后运行的是*.clas

jsp运行原理图:

  • JSP 脚本片段和声明

JSP脚本片断(scriptlet)是指嵌套在<% %>之中的一条或多条Java程序代码。

一个JSP页面中可以有多个脚本片断

多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<% %>之中的情况

单个脚本片断中的Java语句可以是不完整的,但是多个脚本片断组合后的结果必须是完整的Java语句

JSP声明将Java代码封装在<%!和 %>之中,它里面的代码将被插入进Servlet_jspService方法的外面,所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。

JSP注释的格式:

  <%-- 注释信息 --%>

 JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= %>之中。举例:Current time: <%= new java.util.Date() %>,其中的变量被自动转为string类型,其后边不能有分号,因为翻译过程中它被翻译为out.write("");

  • JSP指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分

JSP指令的基本语法格式:

  <%@ 指令 属性名="" %>

  举例:<%@ page contentType="text/html;charset=UTF-8"%>

  注意:属性名部分是大小写敏感的。

在目前的JSP 2.0中,定义了pageincludetaglib这三种指令,每种指令中又都定义了一些各自的属性。

page指令最好是放在整个JSP页面的起始位置 

  1. Page指令各项属性及其作用图

errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。

可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。

如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。

2.include指令

include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet

  • JSP九大内置对象

九大内置对象的说明在这

  • EL表达式(Expression Language 表达式语言)

JSP页面中可以直接使用,

EL用来代替<%=...%><%=...%>代表输出,EL表达式是用来输出的

语法:${表达式}

EL的11个内置对象:

pageScope

表示pageContext的域对象

requestScope

表示request

sessionScope

表示session

applicationScope

表示application

param

获取参数的

paramValues

header

获取http

headerValues

initParam

获取配置信息

cookie

表示cookie

pageContext

最重要的对象- 工具类,可获取其他对象

例如${pageContext.request}

1获取请求头header : ${header }<hr>

2获取请求头headerValues : ${headerValues }<hr>

3获取参数param : ${param }<hr>

4获取参数paramValues : ${paramValues }<hr>

5获取配置信息initParam : ${initParam }<hr>

6获取cookie : ${cookie }<hr>

7获取pageScope : ${pageScope }<hr>

8获取requestScope : ${requestScope }<hr>

9获取sessionScope : ${sessionScope }<hr>

10获取applicationScope : ${applicationScope }<hr>

11获取pageContext : ${pageContext }<hr>

EL的范围取值;

1、从四个域中通过key找到简单数据并显示出来

  ${name}

四个域的寻找顺序是 pageContextrequestsessionapplication(从大到小找)。若找不到键值为name的属性值,不会显示null,会显示空字符串。也可以从指定范围内取值

  ${pageScope.name}

  ${requestScope.name}

  ${sessionScope.name}

  ${applicationScope.name}

代码实例,从数组,map和list中取值:

Servlet中

package com.java;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.java.po.User;


/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * 
     */
    public TestServlet() {
      
    }

	/**
	 * 
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//数组
		String[] array= {"妲己","嬴政","貂蝉"};
		
		request.setAttribute("array", array);
		
		//request.getRequestDispatcher("/el.jsp").forward(request, response);
		
		//集合
		ArrayList<String> list = new ArrayList<String>();
		list.add("兰陵王");
		list.add("兰陵");
		list.add("兰");
		list.add("");
		request.setAttribute("list", list);
		
		//创建对象
		
		User user=new User("韩信","18");
		HttpSession session = request.getSession();
		session.setAttribute("users.user", user);
		
		//一组对象
		List<User> lsUser=new ArrayList<User>();
		lsUser.add(new User("卢布","18888"));
		lsUser.add(new User("宫本","12222"));
		request.setAttribute("lsUser", lsUser);
		
		//Map
		HashMap<String, User> hashMap = new HashMap<>();
		
		hashMap.put("user", new User("sse","123"));
		
		request.setAttribute("hashMap", hashMap);
		
		request.getRequestDispatcher("/el.jsp").forward(request, response);
	}

	/**
	 * 
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

}

JSP中:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%
			application.setAttribute("name", "诸葛亮");
			session.setAttribute("name", "干将");
			request.setAttribute("name", "武则天");
			pageContext.setAttribute("name", "安其拉");
		%>
		<!-- 从某一范围 中根据name取值=,如果没有指定从哪个范围中取,
		默认先从作用域最大的对象中取,如果取到直接返回,如果想明确指定从哪个域小红去取,
		加上×××cope-->
		
		a${name }<br/>
		b${requestScope.array[0]}<br/>
		c${applicationScope.name }<br/>
		d${requestScope.list[1] }<br/>
		e${sessionScope["users.user"].userName }<br/>
		f${requestScope.lsUser[0].userName }<br/>
		g${requestScope.hashMap.user.userName }<br/>
		
		
		
		
		<!-- 运算符常见运算符:==(eq)   !=(ne)    <(lt)  
  >(gt)    <=(le)    >=(ge)    &&(and)   ||(or)   !(not)
 -->
		${1 eq 1 }<br/>

<!--          Empty 1:用于判断是否某个值是否存在。如果一个字符串为””则也是true.
	       2:用于判断集合类是否里面没有数据。
-->
		${empty map }<br/>
		${5 eq 6 ? "相等":"不相等"}<br/>kk
</body>
</html>
  • JSTL标签

apacheEL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言。

不是JSP的内置标签,使用时需要导包(jstl-1.2.jar

JSTL标签库包括五个,分别是

1core:核心标签库      核心标签,执行一些输出,设置值,可遍历(常用)

2fmt:格式化标签库    格式化标签,可格式化日期、数字等

3sql:数据库标签库     用于在页面执行sql

4xmlxml标签库         操作XML的标签

5JSTL函数                    字符串处理函数

jstl导入方式:

prefix="c":指定标签库的前缀

uri="http://java.sun.com/jstl/core":指定标签库的uri

jstl使用:

  1. c:out  输出信息到页面,相当于${}

  1. c:set 设置值

  1. c:remove 设置值

Scope: 可选四大域对象page|request|session|application,默认为page 

  1. Øc:url 输出路径

  1. Øc:if 判断

  1. Øc:choose  判断 相当于if elseif else

  1. Øc:forEach  遍历

items

要被循环的信息

begin

开始的元素(0=第一个元素,1=第二个元素)

end

最后一个元素(0=第一个元素,1=第二个元素)

step

每一次迭代的步长

var

代表当前条目的变量名称

varStatus

代表循环状态的变量名称

.count 表示迭代计数

count:循环元素的个数

index:循环元素的下标

first:是否为第一个元素

last:是否为最后一个元素

current:当前元素

  • MVC设计模式

猜你喜欢

转载自blog.csdn.net/NaXieNianWoMenYiQ/article/details/88076499
今日推荐