javaweb学习笔记之JSP,JavaBean,EL

目录

JSP

1.1 JSP的基础

1 jsp的原理

2 jsp的作用

3 jsp和Servlet的分工

4  jsp的组成

5 jsp中的代码使用

1.2 jsp三大指令

1 page

2 include –> 静态包含

3 taglib –> 导入标签库

1.3 jsp对象

1.4 JSP动作标签

javaBean

2.1 JavaBean:是一种规范,即对类的要求

2.2 内省:通过反射来操作JavaBean(符合javabean规范类)

1  内省类

2  反射设置Javabean

2.3 JSP中与JavaBean相关的标签

EL表达式

3.1 操作对象

1 EL 11个内置对象

2 EL操作四大域的内置对象:

3 操作JavaBean

4 操作List

5 操作Map

3.2 EL操作参数内置对象:Map类型

1 EL操作请求头内置对象:Map类型

2 Cookie相关的内置对象:Map类型

3 pageContext内置对象:PageContext类型

4 EL中最重要的就是操作四大域!

3.3 自定义函数库


JSP

1.1 JSP的基础

1 jsp的原理

jsp其实是一种特殊的Servlet
当jsp页面第一次被访问时,服务器会把jsp编译成java文件(Servlet类),然后再把java编译成.class文件,通过创建该类对象,调用其service()方法
第二次请求同一jsp时,则直接调用service()方法
在tomcat的work目录下可以找到jsp对应的.java源代码

2 jsp的作用

Servlet:在设置html响应体的时候,需要大量的response.getWriter().print("")//动态资源,可以编程
html:属于静态页面,不包含动态信息//不用为输出html标签而发愁
jsp:在原有html的基础上添加java脚本,构成jsp页面//即在html中添加java代码

3 jsp和Servlet的分工

JSP:
 作为请求发起和结束页面,例如显示表单,超链接/显示数据
Servlet:
 作为请求中处理数据的环节

4  jsp的组成

JSP = html + java脚本 + jsp标签(指令)
jsp中有9个内置对象,无需创建即可使用:
out、config、page、pageContext
exception、request(HttpServletRequest)、response(HttpServletResponse)、application(ServletContext)、session(HttpSession)
3中java脚本:
 <%…%>:java代码片段,用于定义java语句(相当于方法)
 <%=…%>:java表达式,用于输出某一条表达式或变量的结果(相当于print)
 <%!..%>:声明,用来创建类的成员变量和成员方法
 <%–…--%>:jsp的注释

5 jsp中的代码使用
 

标签语法用途
声明标签<%! 变量或方法声明%>声明JSP内所使用的全局变量或方法或内部类(它用于定义成员)(写的内容在成员位置上)
表达式<%= 表达式 %>输出java中变量或者表达式的值到页面上(它用于输出) out.print(内容)
程序代码标签<%程序代码%>编写java程序代码,但不可以定义代码(它用于定义局部)(声明的变量在局部位置_jspService方法中)
<%@ 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>
<%! int i = 10; %> <!-- 成员变量 -->
<%! public void show(){} %> <!-- 成员方法 -->
<% int i = 100; %>
<%= "hello" %>
</body>
</html>

注意:<%! %>中的内容,作为类的成员变量和成员函数,写在类的成员位置。

<% %>中的内容,写在_jspService函数中。

<%@ 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>
<%! 
	int i = 10;
%> <!-- 成员变量 -->
<%! 
	public void show(){} 
%> <!-- 成员方法 -->
<% int i = 100; %>
输出函数中的i:<%=i%>
输出成员变量i:<%=this.i %>
</body>
</html>

上面声明,下面可以直接用,因为被编译到一个类中,知道被编译的位置,就可以直接正确使用。

如果把一个数据存在request域中(因为_jspService方法参数就是request和response,所以可以直接用),取值操作如下:

<%@ 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>
<%request.setAttribute("name","tom"); %>
<%=request.getAttribute("name")==null ? "" : request.getAttribute("name") %><br>
${requestScope.name}
</body>
</html>

java代码和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>
<%
	for(int i = 0; i < 10; i++){
		%>
		hello&nbsp;<%=i %><br>
		<%
	}
%>
</body>
</html>
<%
String path=request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path=request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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>
<%=path %><br>
<%=basePath %>
<form action="<%=path %>/login">
	<input type="submit">
</form>
<form action="<%=basePath%>login">
	<input type="submit">
</form>
</body>
</html>

建议使用<%=path%>/login

1.2 jsp三大指令

1 page

<%@page language=”java” info=”xxx”…%>**

  • pageEncoding和contentType:

pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding!

contentType:它表示添加一个响应头:Content-Type!等同与response.setContentType(“text/html;charset=utf-8”);

如果两个属性只提供一个,那么另一个的默认值为设置那一个。

如果两个属性都没有设置,那么默认为iso

  • import:导包!可以出现多次
  • errorPage和isErrorPage

errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定

isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
 

<error-page>有两种使用方式:
<error-code>和<location>子元素;
<exception-type>和<location>子元素;
其中<error-code>是指定响应码;<location>指定转发的页面;<exception-type>是指定抛出的异常类型。

 <error-page>
    <error-code>404</error-code>
    <location>/error/errorPage.jsp</location>
 </error-page>
      <error-page>
 <exception-type>java.lang.RuntimeException</exception-type>
        <location>/index.jsp</location>
      </error-page>
  • autoFlush和buffer

autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常!
buffer:指定缓冲区大小,默认为8kb,通常不需要修改!

  • sELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!
  • (以下了解即可):

language:指定当前jsp编译后的语言类型,默认值为java。
info:信息!
isThreadSafe:当前的jsp是否支持并发访问!
session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
extends:让jsp生成的servlet去继承该属性指定的类!

2 include –> 静态包含

  • 与RequestDispatcher的include()方法的功能相似!
  • <%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
  • RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!
  • 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
     

3 taglib –> 导入标签库

两个属性:
  prefix:指定标签库在本页面的前缀,由我们自己来起名称!
  uri:指定标签库的位置

<%@taglib prefix="pre" uri="" %>

1.3 jsp对象

在jsp中无需声明即可直接使用的9个对象

  • out(JspWriter):等同与response.getWriter(),用来向客户端发送文本数据;
  • config(ServletConfig):对应“真身”中的ServletConfig;
  • page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型;
  • pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象;
  • exception(Throwable):只有在错误页面中可以使用这个对象;
  • request(HttpServletRequest):即HttpServletRequest类的对象;
  • response(HttpServletResponse):即HttpServletResponse类的对象;
  • application(ServletContext):即ServletContext类的对象;
  • session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。

pageContext(一个顶9个!)
     Servlet中有三大域,而JSP中有四大域!
     ServletContext:整个应用程序
     session:整个会话(一个会话中只有一个用户)
     request:一个请求链!
     pageContext:一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
域对象
    代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
   全域查找:pageContext.findAttribute(“xxx”);从小到大,依赖查找!
    获取其他8个内置对象:

1.4 JSP动作标签

动作标签是由tomcat(服务器)来解释执行!而html标签由浏览器来执行!

  • <jsp:include>

例如:<jsp:include page="xxx"/>,用来包含指定的页面。假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。
注意:<jsp:include page="<%=myfile%>">,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。
该标签内部使用的是RequestDispatcher#include()方法完成的包含

  • <jsp:forward>

例如:<jsp:forward page="xxx"/>,用来转发到指定页面
例如在a.jsp中存在如下内容:<jsp:fowrad page="b.jsp"/>
a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad>标签下面的内容不会被执行。

  • <jsp:param>

该标签是和的子标签,用来向其他页面传递参数。
 

javaBean

2.1 JavaBean:是一种规范,即对类的要求

JavaBean规范:
(1)必须要有一个(无参)默认构造器
(2)必须要为成员提供get/set方法,如果只有get方法,则称这个属性为只读属性
(3)属性:有get/set方法的成员(可以没有成员),属性名称由get/set方法来决定(getName->属性名:name)
(4)方法名称满足规范的成员就是属性,boolean类型的属性,它的读方法可以是is开头,也可以是get开头

2.2 内省:通过反射来操作JavaBean(符合javabean规范类)

1  内省类

–> Bean信息 –> 属性描述符 –> 属性的get/set对应的Method! — > 反射

  • 通过Class对象获取BeanInfo

BeanInfo info = Introspector.getBeanInfo(User.class);

  • 通过BeanInfo获取所有属性描述符对象

PropertyDescriptor[] pds = info.getPropertyDescriptors();

  • PropertyDescriptor:
  1. String name getName():获取当前属性名称
  2. Method getReadMethod():获取get方法反射对象
  3. Method getWriteMethod():获取set方法反射对象

2  反射设置Javabean

  1. jar包 commons-beanutils.jar、commons-logging.jar

https://download.csdn.net/download/mocas_wang/12390952

  1. 通过反射设置Javabean
Class<User> clazz = User.class;
Object user = clazz.newInstance();
BeanUtils.setProperty(user, “username”, “admin”);
BeanUtils.setProperty(user, “password”, “admin123”);

    3.获取属性值

String username = BeanUtils.getProperty(user, “username”);

   4 把Map数据封装到JavaBean对象中

/*创建hashmap,放置键值对*/
Map<String,String> map=new HashMap<String,String>();
map.put("username","zhangsan");
map.put("password","12345");
user user=new user();
/*将map数据放进user*/
BeanUtils.populate(user,map);
System.out.println(user);

要求:map的key名称必须与User类的属性名称相同。不要无法赋值!

2.3 JSP中与JavaBean相关的标签

  • <jsp:useBean>
  • <jsp:setProperty>
  • <jsp:getProperty>
<jsp:useBean id="user1" class="cn.domain.User" />

查看page域中是否存在user1这个域属性,如果存在,那么直接获取。
如果不存在,那么创建之!
等同与:

User user1 = pageContext.getAttribute(“user1”);
if(user1 == null) {
user1 = new User();//创建user1对象
pageContext.setAttribute(“user1”, user1);//保存到page域
}

可以通过scope属性来指定操作

设置属性值:

<jsp:setProperty property="username" name="user1" value="admin"/>
  • name:指定名为user1的JavaBean
  • property:指定要设置的属性名称
  • value:指定要设置的属性值

等同与

User user1 = (User)pageContext.getAttribute(“user1”);
user1.setUsername(“admin”);
  • **<jsp:getProperty>**获取属性值
  • <jsp:getProperty property="username" name="user1"/>输出user1这个javaBean的username属性值

等同与

User user1 = (User)pageContext.getAttribute(“user1”);
out.print(user1.getUsername());

EL表达式

EL:Expression Language,它是可以在JSP页面中直接使用的语言!
JSP页面也可以忽略EL:<@page isELIgnored=”true”%>
EL用来代替<%=…%>

3.1 操作对象

1 EL 11个内置对象

EL可以输出的东西都在11个内置对象中!11个内置对象,其中10个是Map!pageContext不是map,它就是PageContext类型,1一个顶九个

  1. ${pageScope.xxx}
  2. ${requestScope.xxx}
  3. ${sessionScope.xxx}
  4. ${applicationScope.xxx}
  5. param:对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。
  6. paramValues:对应参数,它是一个Map,其中key参数名,value是多个参数值,适用于多值的参数。
  7. header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值请求头
  8. headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头
  9. initParam:获取<context-param>内的参数!
  10. cookie:Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象。 ${cookie.username.value}
  11. pageContext:它是PageContext类型!${pageContext.request.contextPath}   这个输出此项目名
     

2 EL操作四大域的内置对象:

它们是Map类型
pageScope
requestScope
sessionScope
applicationScope

${pageScope.user}:输出pageContext.getAttribute("user")
${requestScope.user}:输出request.getAttribute("user");
${sessionScope.user}:输出session.getAttribute("user");
${applicationScope.user}:输出application.getAttribute("user");

${user}
依次在pageScope、requestScope、sessionScope、applicationScope中查找user
如果查找到,那么立刻停止查找。

3 操作JavaBean

<%
User user = new User();
user.setUsername(“zhangSan”);
user.setPassword(“123”);
pageContext.setAttribute(“user”, user);
%>
${pageScope.user.username}
${pageScope.user.password}

4 操作List

<%
User user = new User();
user.setUsername(“zhangSan”);
user.setPassword(“123”);
List list = new ArrayList();
list.add(user);
pageContext.setAttribute(“list”, list);
%>
${pageScope.list[0].username}
${pageScope.list[0].password}

5 操作Map

<%
User user = new User();
user.setUsername(“zhangSan”);
user.setPassword(“123”);
Map map = new HashMap();
map.put(“u1”, user);
pageContext.setAttribute(“map”, map);
%>
${pageScope.map['u1'].username}
${pageScope.map['u1'].password}

${pageScope.map.u1.username}
${pageScope.map.u1.password}

3.2 EL操作参数内置对象:Map类型

param:Map<String,String>
paramValues:Map<String,String[]>
${param.username}:request.getParameter("username")
${paramValues.hobby}:request.getParameterValues("hobby");

1 EL操作请求头内置对象:Map类型

header:Map<String,String>
headerValues:Map<String,String[]>

${header.UserAgent}
${headerValues.UserAgener[0]

2 Cookie相关的内置对象:Map类型

cookie:Map<String,Cookie>,其中key是Cookie的名称,而值是Cookie对象

${cookie.jsessionid.value}:获取sessionid

3 pageContext内置对象:PageContext类型

${pageContext.request},等同pageContext.getRequest()
${pageContext.session},等同pageContext.getSession()

${pageContext.request.contextpath},获取项目名
${pageContext.session.id},获取sessionId

4 EL中最重要的就是操作四大域!

使用EL函数库需要在JSP页面中导入标签库:

导入标签库:<%@ tablib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions”%>

String toUpperCase(String input):把参数转换成大写
String toLowerCase(String input):把参数转换成小写
int indexOf(String input, String substring):从大串,输出小串的位置!
boolean contains(String input, String substring):查看大串中是否包含小串
boolean containsIgnoreCase(String input, String substring):忽略大小写的,是否包含
boolean startsWith(String input, String substring):是否以小串为前缀
boolean endsWith(String input, String substring):是否以小串为后缀
String substring(String input, int beginIndex, int endIndex):截取子串
String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串
substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串
String escapeXml(String input):把input中“<”、”>”、”&”、”’”、”“”,进行转义
String trim(String input):去除前后空格
String replace(String input, String substringBefore, String substringAfter):替换
String[] split(String input, String delimiters):分割字符串,得到字符串数组
int length(Object obj):可以获取字符串、数组、各种集合的长度!
String join(String array[], String separator):联合字符串数组!
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function"%>

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
…
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/> <!-- hello -->
${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->

${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
${fn:trim("     a b c     ")}<br/><!-- a b c -->
${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->

3.3 自定义函数库

  • 写一个java类,类中可以定义0~N个方法,但必须是static,而且有返回值的!
  • 在WEB-INF目录下创建一个tld文件
<function>
    <name>fun</name>
    <function-class>haha.fn.MyFunction</function-class>
    <function-signature>java.lang.String fun()</function-signature>
</function>
  • 在jsp页面中导入标签库
    <%@ taglib prefix=”it” uri=”/WEB-INF/tlds/haha.tld” %>
  • 在jsp页面中使用自定义的函数:${it:fun() }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值