JavaEE学习笔记(Servlet、JSP、JSTL、EL)及相关案例(Session+Cookie+Filter实现免登录功能;一整套CURD操作案例等)

一、JavaEE开发基本技术及环境搭建

1、Java的三个体系
①、J2SE:基于桌面的应用软件的开发
②、J2ME:基于手机方面的开发
③、J2EE:企业级基于B/S结构的应用软件的开发

2、J2EE中两个极其重要的web组件
①、JSP:动态网页技术 HTML:用于开发静态网页技术
②、Servlet:业务控制器

3、服务器端的搭建,涉及到一个web服务器,只有安装了某个web服务器的那一端才承担,B/S结构中的这个B端
①、web服务器:tomcat,jboss ,weblogic等
②、Tomcat是apache公司的开源免费的web服务器
A:安装版的tomcat:
B:解压版的tomcat: 结合Eclipse+Tomcat 完成学习以及项目开发阶段的环境

首先启动Eclipse,启动后在eclipse中配置tomcat,后续再开发以及测试阶段直接在eclipse中启动tomcat即可
http://192.168.39.1:8080/j2ee01-environment/test.html

4、在Eclipse中创建动态的web项目,Dynamic Web Project
其目录结构如下

这里写图片描述

5、在WebContent下创建login.jsp jsp在后续中详细介绍,目前只需在jsp中的嵌入html代码即可
①、创建jsp文件
这里写图片描述

②、创建Servlet
这里写图片描述

③、要注意如下B/S图例
这里写图片描述

6、IP地址:IP地址是互联网上电脑的唯一身份,就像咱们的身份证号码一样,
IP的组成:是由四组0-255之间的整数组成 126.64.138.24
http://127.0.0.1:8080/j2ee01-environment/login.jsp
http://192.168.39.1:8080/j2ee01-environment/login.jsp

7、在jee环节,甚至是在项目开发过程中,经常会遇到404号错误(请求的目标组件找不到就会出现404)

8、HTTP协议:由万维网以及internet协会一起研讨出来的结果。Http(超文本传输协议)是一个面向无连接无状态基于请求与应答模式的应用层协议。
①、http协议的请求部分 由请求行、请求报头,空行,请求参数 四部分组成
②、http协议的响应部分 由状态行,响应报头,空行,消息正文 四部分组成
相关协议信息可以在浏览器上通过F12进入到调试窗口,单击network菜单,然后再页面部分刷新页面(F5),然后在后面的headers中可以查看相关的协议信息
这里写图片描述

9、B/S结构的请求应答模式流程图

这里写图片描述

10、请求周期:一个请求周期是从客户端浏览器发起一个请求,直到客户端浏览器看到请求的结果,这个期间即是一个请求周期

二、Servlet学习笔记
Servlet,Servlet是用Java编写的一个用于接收http请求的业务控制器
作用:可以接受http请求,并可以产生响应
1、开发人员怎样创建Servlet业务控制器呢?通过自定义类然后继承HttpServlet即可
根据实际需求重写init destroy service(doGet|doPost)方法

2、Servlet的生命周期,Servlet的生命周期通过几个方法完成
①、init:Servlet到初始化 创建Servlet实例时调用这个方法
②、service方法:是多个方法的统称,包括有doGet doPost doDelete doPut等,根我们实际相关的有doGet和doPost
③、destroy:消亡方法,在Servlet使用完毕后,由GC释放Servlet资源是调用destroy方法

3、Servlet的包,javax.servlet.http.*包下, HttpServlet

4、Servlet的映射
①、通过web.xml配置映射关系 web.xml是当前的web项目的配置文件,处于WEB-INF目录下

  <servlet>											
  	<servlet-name>aabbcc</servlet-name>										
  	<!-- 指定Servlet全类名 -->										
  	<servlet-class>com.action.MyServlet</servlet-class>										
  </servlet>											
  											
  <!-- 											
  	配置http请求的映射 										
  	url-pattern:设置请求的url地址										
  	servlet-name:设置请求的映射字符串,随便写,只要和..《serlvet》元素内《servlet-name》的值...一致即可										
  -->											
  <servlet-mapping>											
  	<servlet-name>aabbcc</servlet-name>										
  	<url-pattern>/abcd</url-pattern>										
  </servlet-mapping>											

web前端请求代码

	<a href="abcd">单击我提交到Servlet</a>				
					
	<form action="abcd">				
		<input type="submit" value="提交"/>			
	</form>				

②、通过@WebServlet这个注解(annotation完成映射,注意,在Servlet3.0版本之前是没有这个注解的,全部通过在web.xml中配置映射关系

//urlPatterns:设置映射的url,和<url-pattern>一样.注意,由于这个属性是String[],所以可以利用找一个知识完成多个请求url映射同一个Servlet上。
//注意:pattern的值必须是“/”开头,这个符号在这里代表当前项目的根目录 /user/add,可以归类不同类型的请求,比如将所有新闻的请求地址设置/news/add /news/delete
//默认情况下,servlet是在用户发起第一次对这个Servlet时才会被创建,但是可以通过loadOnStartup设置当前Servlet在Tomca启动后即创建
/*
loadOnStartup属性可以接收负值,0,以及正数
负数:是在第一次请求时被创建,即默认的。
0:是在tomcat启动时创建
正数:值越小,其优先级别越高
*/

@WebServlet(urlPatterns={"/user/add","/test","/abc"},loadOnStartup=1)											
public class AnnoServlet extends HttpServlet {											
	public void init() throws ServletException {										
		System.out.println("AnnoServlet.init() is running..............");									
	}										
											
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {										
		System.out.println("AnnoServlet.doGet()");									
	}										
}											

5、JavaEE中涉及到的对象,HttpServlet ServletConfig HttpServletRequest HttpServletResponse
①、HttpServlet对象即是Servlet, HttpServlet中提供了诸多方法,比如获取当前Servlet的全类名、获取ServletConfig对象等方法
System.out.println(this.getServletName());返回当前Servlet的全类名
②、HttpServletRequest对象:可以获取请求者的相关信息,获取当前Servlet的相关信息
比如获取当前请求的端口号 8080
比如获取请求中的参数 获取用户名的值 request.getParameter(“userid”);
比如获取请求的URL地址
等等
System.out.println(req.getMethod());
System.out.println(req.getLocalPort());
System.out.println(req.getRequestURL());
System.out.println(req.getRemotePort());
③、HttpServletResponse对象:是HttpServlet响应请求的对象,比如可以向响应的页面中传递参数等,设置相应的字符编码方式等

比如设置响应的结果画面的url地址 response.sendRedirect(“main.jsp”);

6、web前端发起请求的方式:
①、通过from表单发起一个请求
②、通过超链接发起一个请求,注意,超链接不像form那样可以通过指定method属性指定请求的方法,超链接只能发起get请求
③、通过通过JavaScript的location对象的href属性发起一个请求
④、直接在浏览器地址栏上写入地址发起请求
⑤、通过AJax发起一个异步请求

7、关于服务器端响应页面给请求者的方法
①、以重定向方式响应
通过response.sendRedirect(); response.sendRedirect(“index.jsp”);
②、以转发方式响应,
通过forword方法响应 request.getRequestDispatcher(“index.jsp”).forward(request, response);

8、get和post方式的区别
①、get方式会将相关url和参数显示在浏览器的地址栏上,而post方式是以io流的方式发起请求的,所以不会再地址栏中显示相关的参数
②、get和post方式提交的参数大小不同,get方式不能提交超过1024个字符
③、相对而言,post比get方式更加安全一些

9、再此强调
Servlet的映射过程
①、在web.xml中通过<servlet- mapping>和<servlet>元素进行映射
②、通过@WebServlet注解(annotation)映射
@WebServlet(urlPatterns={"*.rock","/userAction","/a/b"},loadOnStartUp=int)
loadOnStartUp=负数:在第一次请求这个Servlet时,Servlet容器才能加载这个Servlet
loadOnStartUp=0:在web服务器(tomcat)启动时,这个Servlet就被加载了
loadOnStartUp=正数:也是在web服务器启动时就会被加载,同时,数值越小其优先级越高。

三、Servlet继续学习

1、关于Servlet中的常用对象
①、HttpServlet
②、HttpServletRequest request.getParameter(“nameValue”);
③、HttpServletResponse

案例:定义个注册表单其中包括复选框,然后在业务控制器中获取其值
2、关于http的get请求的url情况
http://localhost:8080/j2ee04-url/UserRegister?userid=刘备&password=&repwd=&name=&degree=博士&mobile=
http://localhost:8080/j2ee04-url/UserRegister?userid=刘备&password=&repwd=&name=&degree=博士&mobile=&skill=Oracle&skill=Mongo

http://localhost:8080/j2ee04-url/UserRegister?userid=liubei&password=admin&repwd=admin&name=刘备&sex=男&degree=学士&mobile=13333333&skill=Oracle&skill=Mongo

注意:get方式提交请求,会将请求中参数显示在地址栏中,那么怎么显示这些参数的呢?
①、所有的参数都默认通过?号来引导
②、参数若有多个,每个参数由&符号分割
③、每个参数由两部分组成,分别是参数名和参数值,参数名和参数值之间用=号分割 userid=rock&password=admin

3、在Servlet中获取复选框的值
String []skills=request.getParameterValues(“skill”);

4、再次确认HttpServletRequest对象中的三个方法
String value=request.getParameter(“nameValue”); 获取一个参数名对应的值
String values[]=request.getParameterValues(“sameAttrName”); 获取多个参数名对应的值的数组
Enumeration all[]=request.getParameterNames(); 获取请求中的所有参数的参数名集合

5、在web前端也就是在浏览器发起请求时,该怎样向服务器端传递参数呢?
①、在form中编写相关的表单元素,这些表单元素会自动传递到服务器端
②、超链接也可以传递参数 <a href=“ArrgumentAction?aa=刘备&password=admin”>提交</a>
③、location.href属性也可以向服务器端传递参数 window.location.href=“ArrgumentAction?aa=rock&password=admin”;
④、浏览器地址栏也可以传递参数 http://localhost:8080/j2ee04-url/ArrgumentAction?aa=刘备&password=admin

6、一个业务控制器接收多个请求,
比如说,所有的新闻操作的请求都提交给NewsAction这个业务控制器 发布新闻,新闻修改,删除新闻
比如说,将所有图书操作的请求都提交给BookAction这个业务控制器 图书上架,图书入库,信息修改
比如说,将所有会员操作的请求都提交给UserAction这个业务控制器
解决方法:在所有相同类型的请求中都加入相同的参数名但是参数值不同,这样的话,就可以在业务控制器中通过不同的参数值,来区分不同的请求

7、根据密保找回密码案例
这里写图片描述

①、创建输入要找回密码的帐号的jsp页面

这里写图片描述

②、创建第一个业务控制器
这里写图片描述

③、创建接收用户密保答案的页面
这里写图片描述

④、创建第二个业务控制器,接收用户id,密保问题,密保答案。获取其密码
这里写图片描述

8、JavaEE中通过回话记录每一个请求。这样服务器端就可以区分开来每个请求了,比如两个请求是否来自同一个人(同一个浏览器)?回话解决区分不同请求的愿望
当第一次请求服务器时,服务器会随机生成一个id值,然后在服务器向请求者响应具体结果时,会将这个id值一并发送给请求者,然后请求者就会在本地保存这个id。
那么下一次再访问服务器时,请求会自动将之前保存下来的ID值一并发送给服务器,这样话,服务器就直到是哪一个请求了

HttpSession session=request.getSession(true);	
session.setAttribute("attrName","attrValue");	
session.getAttribute("attrName");	

9、重定向和转发方式的区别
①、重定向方式客户端发起了两次请求周期,而转发方式客户端仅仅发起了一个请求周期
②、转发方式不会再地址栏中显示具体URL,而重定向方式会在地址栏中显示具体的结果页面。
这里写图片描述

10、在b/s结构中,参数的传递时不可避免的,必须要有参数的传递(个web组件间共享数据)
a组件中有一个数据,希望在b组件中访问,
案例:比如登录成功后,在下一个页面中显示你好【张三|李四】
登录页面:login.jsp
业务控制器:Servlet 张三|李四…. userid,password,truename,….
主页面:main.jsp
解决方案:
①、通过get方式传递参数
②、作用域来共享参数,也就是说在同一作用域内,所有的web组件共享数据
在Servlet中,有几个作用域呢?
A:请求作用域(HttpServletRuquest) 在同一个请求周期内的所有web组件共享一个属性 同一个请求周期都属于同一个请求作用域
B:回话作用域(HttpSession), 在同一个回话周期内的所有web组件共享一个属性 浏览器不关闭情况属于同一个回话
C:应用作用域(SerlvetContext) 在同一个应用周期内的所有web组件共享一个属性 只要web服务器不重新启动,都属于一个应用范围
③、作用域属性的操作
A:向作用域内存储属性 scopeObj.setAttribute(“attrName”,attrValue);
B:从作用域内取属性 scopeObj.getAttribute(“attrName”);

11、回话进阶,HttpSession的一些知识
①、回话的默认生命周期,其他环境下,回话的默认生命周期是20分钟,但是在tomcat中的回话的默认周期是30分钟。
②、在特殊需求情况下,开发人员可以手工的方式修改这个默认生命周期
A:在web.xml中配置回话的生命时长

  <!-- 配置session的过期时间 -->
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>

B:可以通过回话对象设置其生命时长

通过Sesson对象的setMaxInactiveInterval(秒)

注意作用域对象的方法
设置属性 setAttribute
获取属性 getAttribute
删除属性 removeAttribute();
更新属性 setAttribute()
session.getAttributeNames()

12、@WebServlet注解中的initParams属性,这个属性是@WebInitParam注解的数组,这个属性用于给Servlet业务控制器配置初始化参数来用的
可以通过ServletConfig对象来获取初始化参数中的值,注意,这个初始化参数是不能被其他Servlet获取的。

package com.rock.action;							
							
import java.io.IOException;							
							
import javax.servlet.ServletConfig;							
import javax.servlet.ServletException;							
import javax.servlet.annotation.WebInitParam;							
import javax.servlet.annotation.WebServlet;							
import javax.servlet.http.HttpServlet;							
import javax.servlet.http.HttpServletRequest;							
import javax.servlet.http.HttpServletResponse;							
							
/**							
 * Servlet implementation class InitServlet							
 * @WebServlet注解详解:							
 * value属性:默认就是请求的url映射字符串    @WebServlet(value="/InitServlet")  <a href="InitServlet">							
 * loadOnStartup:设置Servlet启动顺序。注意   正数 0  负数							
 * urlPatterns:设置多个映射地址							
 * initParams:为Servlet设置初始化参数							
 * 							
 */							
@WebServlet(urlPatterns={"/a","/b"},initParams={							
		@WebInitParam(name="userid",value="rock"),					
		@WebInitParam(name="password",value="admin")},loadOnStartup=1)					
public class InitServlet extends HttpServlet {							
	private static final long serialVersionUID = 1L;						
       							
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {						
		response.getWriter().append("Served at: ").append(request.getContextPath());					
	}						
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {						
		doGet(request, response);					
	}						
	public void init(ServletConfig config) throws ServletException {						
		System.out.println(config.getInitParameter("userid"));					
		System.out.println(config.getInitParameter("password"));					
	}						
}							

13、ServletContext对象是应用作用域对象,在tomcatweb服务器没有重启之前都属于同一个作用域
那么若多个Severlet都需要使用的初始化参数怎么处理呢?可以通过全局参数达成这个目标
全局参数的配置需要在项目的配置文件中配置,即在web.xml中配置

14、web.xml常用配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>j2ee05-important</display-name>
  <!-- 配置欢迎页,即默认没有指定请求的web组件时,web容器会以welcome-file的顺序依次寻找相关的组件响应给请求者 -->
  <welcome-file-list>
    <welcome-file>DServlet</welcome-file>
  </welcome-file-list>
  <!-- 配置session的过期时间 -->
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
  <!-- 配置全局的初始化参数,是当前项目下的所有业务控制器共享的参数,也就是所有HttpServlet都可以访问的参数 -->
  <context-param>
  	<param-name>systemName</param-name>
  	<param-value>UserManagerSystem</param-value>
  </context-param>
  <!-- 给项目配置错误页 -->
  <error-page>
  	<!-- 配置HTTP错误状态码,404代表了目标组件找不到 -->
  	<error-code>404</error-code>
  	<!-- 若当前项目出现了404号错误后,web服务器将会以location页面响应给请求者 -->
  	<location>/404.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/500.jsp</location>
  </error-page>
</web-app>

15、Servlet作用域
①、request 请求域 HttpServletRequest 注意:判断两个web组件是否处于同一个请求周期内
②、session 回话域 HttpSession 浏览器关闭
③、application 应用域 ServletContext tomcatweb服务器重启

16、过滤器 Filter
利用过滤器开发人员常用的几个应用是
①、完成安全性检查 确定是否登录过
②、设置项目相关的字符编码
③、Filter+Cookie :设置无需登录功能(记住密码)

17、Cookie,Cookie是存储在客户端浏览器中的纯文本信息

18、利用Cookie+Session+Filter实现免登陆功能
这里写图片描述

这里写图片描述

这里写图片描述

19、乱码解决方案:
①、在Server.xml中配置请求get参数编码
这里写图片描述
②、在Servlet中通过request和response指定请求的编码和响应的编码
request.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html”);
response.setCharacterEncoding(“UTF-8”);

③、通过URLEncode进行编码
String value=“被编码的字面值”;
String s=URLEncoder.encode(value, “UTF-8”);
④、通过String对象进行编码
String value=“被编码的字面值”;
String s1=new String(value.getBytes(),“UTF-8”);
⑤、通过过滤器(拦截器)解决乱码


/**
 * 通过过滤器解决汉字乱码问题
 */
@WebFilter(value="/*",initParams={@WebInitParam(name="charset",value="UTF-8")})
public class EncodeFilter implements Filter {
	private String charset;
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletResponse resp=(HttpServletResponse)response;
		req.setCharacterEncoding(charset);
		resp.setCharacterEncoding(charset);
		
		chain.doFilter(req, resp);
	}
	@Override
	public void init(FilterConfig fConfig) throws ServletException {
		this.charset=fConfig.getInitParameter("charset");
	}
	@Override
	public void destroy() {
	}
}

三、JSP技术
1、JSP:Java Server Page:是Java提供的一个用于开发动态页面的技术。Jsp也是j2ee的重要组成部分,
2、JSP中都哪些技术呢?
①、jsp中可以嵌入HTML代码
②、JSP有自己的固有技术
3、jsp固有技术
①、指令元素
②、动作元素
③、脚本元素
④、JSTL
⑤、EL表达式
⑥、内置对象 9个

4、指令元素 jsp中的三大指令元素

①、page指令元素,page指令元素中设置的是当前jsp页面相关属性,不如当前页面使用什么编码呢?比如当前页面支持session吗等
②、include指令元素,用于包含其他的jsp(html)页面
③、taglib指令元素,用于在jsp中导入第三方标签库

指令元素语法:
所有的指令是 <%@指令元素 属性列表 %>结尾

四、指令元素详解
1 JSP指令概述
JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的。
JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。
2 page指令
page指令是最为常用的指定,也是属性最多的属性!
page指令没有必须属性,都是可选属性。例如<%@page %>,没有给出任何属性也是可以的!
在JSP页面中,任何指令都可以重复出现!
<%@ page language=”java”%>
<%@ page import=”java.util.*”%>
<%@ page pageEncoding=”utf-8”%>
这也是可以的!
3 page指令的pageEncoding和contentType(重点)
pageEncoding指定当前JSP页面的编码!这个编码是给服务器看的,服务器需要知道当前JSP使用的编码,不然服务器无法正确把JSP编译成java文件。所以这个编码只需要与真实的页面编码一致即可!在MyEclipse中,在JSP文件上点击右键,选择属性就可以看到当前JSP页面的编码了。
contentType属性与response.setContentType()方法的作用相同!它会完成两项工作,一是设置响应字符流的编码,二是设置content-type响应头。例如:<%@ contentType=”text/html;charset=utf-8”%>,它会使“真身”中出现response.setContentType(“text/html;charset=utf-8”)。
无论是page指令的pageEncoding还是contentType,它们的默认值都是ISO-8859-1,我们知道ISO-8859-1是无法显示中文的,所以JSP页面中存在中文的话,一定要设置这两个属性。

其实pageEncoding和contentType这两个属性的关系很“暧昧”:
 当设置了pageEncoding,而没设置contentType时: contentType的默认值为pageEncoding;
 当设置了contentType,而没设置pageEncoding时: pageEncoding的默认值与contentType;

也就是说,当pageEncoding和contentType只出现一个时,那么另一个的值与出现的值相同。如果两个都不出现,那么两个属性的值都是ISO-8859-1。所以通过我们至少设置它们两个其中一个!

4  page指令的import属性
import是page指令中一个很特别的属性!
import属性值对应“真身”中的import语句。
import属性值可以使逗号:<%@page import=”java.net.,java.util.,java.sql.*”%>

import属性是唯一可以重复出现的属性:
<%@page import=”java.util.” import=”java.net.” import=”java.sql.”%>
但是,我们一般会使用多个page指令来导入多个包:
<%@ page import=”java.util.
”%>
<%@ page import=”java.net.”%>
<%@ page import=”java.text.
”%>

5 page指令的errorPage和isErrorPage
我们知道,在一个JSP页面出错后,Tomcat会响应给用户错误信息(500页面)!如果你不希望Tomcat给用户输出错误信息,那么可以使用page指令的errorPage来指定错误页!也就是自定义错误页面,例如:<%@page errorPage=”xxx.jsp”%>。这时,在当前JSP页面出现错误时,会请求转发到xxx.jsp页面。

a.jsp

<%@ page import="java.util.*" pageEncoding="UTF-8"%>
<%@ page  errorPage="b.jsp" %>
    <%
    	if(true)
    		throw new Exception("哈哈~");
    %>

b.jsp

<%@ page pageEncoding="UTF-8"%>
<html>
  <body>
   <h1>出错啦!</h1>
  </body>
</html>

6、taglib指令
  这个指令需要在学习了自定义标签后才会使用,现在只能做了了解而已!
在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。

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

在这9个对象中有很多是极少会被使用的,例如:config、page、exception基本不会使用。
在这9个对象中有两个对象不是每个JSP页面都可以使用的:exception、session。
在这9个对象中有很多前面已经学过的对象:out、request、response、application、session、config。

六、动作元素 jsp提供的一个专门在jsp文件中访问Java类的相关标记
所有的动作元素都是jsp:元素名称</> jsp是动作元素的访问前缀

<jsp:useBean id="user" class="com.rock.entities.User"></jsp:useBean>	

id:指定对象名称
class:指定对象类型
scope:指定对象的作用域
scope属性的四个取值
①、page:对象仅仅是在当前jsp文件中有效
②、request:在当前请求周期内有效
④、session:在当前回话周期内有效
④、application:在当前应用范围内有效

<!-- 创建一个对象,对姓名user ,这个对象的类型是User类型,如下动作元素===》  User user=new User() -->	
<jsp:useBean id="user" class="com.rock.entities.User" scope="request"></jsp:useBean>	

设置对象的属性值
property:属性名称
name:对象名称
value:属性的值

<jsp:setProperty property="userid" name="user" value="刘备1"/>								
<jsp:useBean id="p" class="com.rock.entities.Person" scope="page"></jsp:useBean>			

七、EL(表达式语言)
1、EL表达式的作用
JSP2.0要把html和css分离、要把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。

2、基本语法

格式:${…}
例如:${1 + 2}

3、关闭EL
如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。
如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:${1 + 2}。

4、EL运算符
这里写图片描述

5、EL不显示null。EL表达式的值为null时,会在页面上显示空白,即什么都不显示

6、EL表达式格式
先来了解一下EL表达式的格式!现在还不能演示它,因为需要学习了EL11个内置对象后才方便显示它。
 操作List和数组:list[0]{list[0]}、{arr[0]};
 操作bean的属性:person.name{person.name}、{person[‘name’]},对应person.getName()方法;
 操作Map的值:map.key{map.key}、{map[‘key’]},对应map.get(key)。

7、EL内置对象
EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象。
 pageScope
 requestScope
 sessionScope
 applicationScope
 param;
 paramValues;
 header;
 headerValues;
 initParam;
 cookie;
 pageContext;

8、域相关内置对象(重点)
域内置对象一共有四个:
 pageScope:${pageScope.name}等同与pageContext.getAttribute(“name”);
 requestScope:${requestScope.name}等同与request.getAttribute(“name”);
 sessionScoep: ${sessionScope.name}等同与session.getAttribute(“name”);
 applicationScope:${applicationScope.name}等同与application.getAttribute(“name”);

如果在域中保存的是JavaBean对象,那么可以使用EL来访问JavaBean属性。因为EL只做读取操作,所以JavaBean一定要提供get方法,而set方法没有要求。
Person.java
这里写图片描述
这里写图片描述

param和paramValues这两个内置对象是用来获取请求参数的。
 param:Map<String,String>类型,param对象可以用来获取参数,与request.getParameter()方法相同。
这里写图片描述

9、Cookie相关内置对象
这里写图片描述

10、pageContext对象,可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest(),可以${pageContext.request}。也就是读取JavaBean属性!!!
这里写图片描述

八、JSTL,java标准标签库,JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以后非常方便,它与JSP动作标签差不多,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已!
如果你使用Eclipse开发JavaWeb,你需要在Eclipse的DynamicWebProject的lib目录下导入jstl的Jar包!
jstl-1.2.jar
standard-1.1.2.jar

1、JSTL一共包含四大标签库:
 core:核心标签库,我们学习的重点;
 fmt:格式化标签库,只需要学习两个标签即可;
 sql:数据库标签库,不需要学习了,它过时了;
 xml:xml标签库,不需要学习了,它过时了。
 functions:函数标签库,主要是对字符串信息进行相关操作

2、使用taglib指令导入标签库
除了JSP动作标签外,使用其他第三方的标签库都需要:
 导包;
 在使用标签的JSP页面中使用taglib指令导入标签库;

下面是导入JSTL的core标签库:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jstl/core” %>

 prefix=“c”:指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;
 uri=“http://java.sun.com/jstl/core”:指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;

3、core标签库常用标签
①、out、set以及remove标签

这里写图片描述

这里写图片描述

这里写图片描述

②、if 、choose标签
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行

<c:set var="a" value="hello"/>
<c:if test="${not empty a }">
	<c:out value="${a }"/>
</c:if>

choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。当所有when标签的test都为false时,才会执行otherwise标签的内容

<c:set var="score" value="${param.score }"/>
<c:choose>
	<c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>
	<c:when test="${score >= 90 }">优秀</c:when>
	<c:when test="${score >= 80 }">良好</c:when>
	<c:when test="${score >= 70 }">中等</c:when>
	<c:when test="${score >= 60 }">及格</c:when>
	<c:otherwise>不及格</c:otherwise>
</c:choose>

③、forEach标签,forEach当前就是循环标签了,forEach标签有多种两种使用方式:
 使用循环变量,指定开始和结束值,类似for(int i = 1; i <= 10; i++) {};
 循环遍历集合,类似for(Object o : 集合);

这里写图片描述

forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
 count:int类型,当前以遍历元素的个数;
 index:int类型,当前元素的下标;
 first:boolean类型,是否为第一个元素;
 last:boolean类型,是否为最后一个元素;
 current:Object类型,表示当前项目。

<c:forEach var="item" items="${ns }" varStatus="vs">
	<c:if test="${vs.first }">第一行:</c:if>
	<c:if test="${vs.last }">最后一行:</c:if>
	<c:out value="第${vs.count }行: "/>
	<c:out value="[${vs.index }]: "/>
	<c:out value="name: ${vs.current }"/><br/>
</c:forEach>

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值