JSP笔记

一:基础篇

@author:杜勇帅

@email:820482874@qq.com

第一章:jsp概述

1:百度百科:jsp https://baike.baidu.com/item/JSP/141543

2 :B/S 和 C/S 模式

B/S 系统是 浏览器/服务器

C/S 系统是 客户端/服务器

B/S C/S 比较 瘦客户端,未来发展趋势;

3.Tomcat服务器简介安装:

百度百科:Tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选

4.Jsp文件被处理的过程

浏览器访问jsp文件时,会被jsp引擎翻译成一个java类,再编译成class文件,最终

Servlet引擎执行class文件,将要响应的内容输出给客户端浏览器。所有要响应的内容都是

通过out.write()或out.print()输出给浏览器的,最终响应给浏览器的其实就是html页面。

Out.write():是输出静态的html元素

Out.print():是输出动态的java元素

两种输出合并在一起,组合成一个完整的html文档,并把html页面通过字符流输出到浏览器上(输出又叫响应)

out.write("rn");out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">rn");out.write("<html>rn");out.write("<head>rn");out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">rn");out.write("<title>Insert title here</title>rn");out.write("</head>rn");out.write("<body>rn");out.write("t<h2>我是index.jsp</h2>rn");out.write("t");for (int i = 1; i <= 5; i++) {out.write("rn");out.write("ti=");out.print(i);out.write("<br>rn");out.write("t");}out.write("rn");out.write("</body>rn");out.write("</html>");

同一个Jsp文件在第一次访问时,会比较慢一点,因为该文件要被翻译和编译,后续再请求该jsp文件时,就不需要再次翻译和编译,所以就很快了。在实际的项目中,正式上线前,所有的jsp页面都会被公司内部员工访问一次。

5.jsp页面的构成元素

在jsp页面上可以存在如下几种元素:

1)静态html元素 ,如

我是h3标签

2)动态jsp脚本,语法<% java代码 %>

<%int a=10,b=2;out.print("a/b="+a/b);%><br>

3)动态jsp表达式,语法:<%=java表达式 %>

例如:

<%=a/b%>
<%=stu.getName() %>

Jsp脚本和表达式不能相互嵌套

4) 注释:jsp页面上可以写两种注释

第1种:html注释,语法:

第2种:jsp注释:语法: <%-- 注释内容 --%>

两种注释的区别:html注释在源代码中可见(保留了html注释),jsp注释在源代码中是没有的

5.3.指令

jsp指令的语法:<%@ 指令名 属性名=”值” 属性名2=”值2” %>

常用指令

1)page指令:设置页面相关的属性,比如使用的脚本语言:language="java",

errorPage属性等

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" errorPage="error.jsp"%>

1)include指令:把其它的文件包含到当前jsp页面中,当前jsp页面叫主文件,使用了include指令包含后,被包含的文件会和主文件一起翻译和编译

使用场合:当一个站点的多个页面的头部或者尾部相同时,就可以用include指令把头部或尾部页面包含到多个页面中。

注意:当要包含一个jsp页面时,要把骨架标签删除,只保留一个page指令和实际的内容就行了

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><div style="background-color: yellow;margin:1px auto;width:90%;height:100px">我是头部</div>

3) taglib指令:引入一个标签库,明天再细讲

4.动作

1. include动作:把其它文件包含到当前jsp文件中,作用和include指令相同。

Incluce动作包含和include指令包含的区别:

1)包含的时间不同: include指令是在被包含文件和主文件内容合并后,在翻译成servlet(java类)的时候把文件包含进来.inlude动作是在请求主文件时就把文件包含进来。

动作包含要早于指令包含。

2)翻译的过程不同:include指令包含时,被包含文件和主文件合并在一起翻译,只会产生主文件翻译后的java类;include动作包含时,被包含文件是单独翻译的

实际项目中,用动作包含或者指令包含都可以

2.forward动作:把当前的请求转发到其它资源上。

语法:

<jsp:forward page="相对 URL 地址" />

特点:是在服务器内部发生的跳转,地址栏上的url没有变(还是最初的url),用户并不知道已经发生了跳转.只能转发到当前项目的资源上

可以连续转发n次,但是浏览器的url始终不变(第1次请求的url)

为什么选择Tomcat:because no money do you konw;

Tomcat7 下载:http://www.java1234.com/a/javaziliao/kfgj/2013/0506/345.html

第二章 jsp基础语法

第一节:page 指令介绍

Language : 用来定义要使用的脚本语言; contentType:定义 JSP 字符的编码和页面响应的 MIME 类型; pageEncoding:Jsp 页面的字符编码

第二节:scriptlet 标签

通过 scriptlet 标签我们可以在 Jsp 里嵌入 Java 代码; 第一种:<%! %> 我们可以在里面定义全局变量、方法、类;

<%!String str="全局变量";
%>
<%!public void fun1(){System.out.println("全局方法");}
%>
<%!class C{private int a;public void f(){System.out.println("全局类");}}
%>
<%int a=1234;String b="java";out.println(a+b+"局部变量");
%>

<%=b %>

第二种:<% %> 我们可以在里面定义局部变量、编写语句; 第三种:<%= %> 我们可以在里面输出一个变量或一个具体内容;

第三节:Jsp 注释

通过 scriptlet 标签我们可以在 Jsp 里嵌入 Java 代码; Html 注释 客户端可见 <%-- --%> Jsp 注释 客户端不可见 // java 单行注释 / / java 多行注释

<h1>Jsp注释</h1>
<!-- html注释,客户端可见 -->
<%--Jsp注释,客户端不可见 --%>
<%int a=1; // 单行注释/* int b=2;int c=3; */
%>

第四节:Jsp 包含指令

<%@ include file=”要包含的文件”%> 静态包含 先包含,后编译处理; 动态包含 先编译处理,后包含; 以后开发用动态包含

我们写2个文件

head.html代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>head</p>
</body>
</html>

footer.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>
Footer
</body>
</html>

使用include拼接代码’

<%-- <h1>静态包含</h1>
<%@ include file="common/head.html" %>             //这是head的相对路径
<p>content</p>
<%@ include file="common/footer.jsp" %> --%>       /这是footer的相对路径
<h1>动态包含</h1>
<jsp:include page="common/head.html"/>
<p>content</p>
<jsp:include page="common/footer.jsp"/>

第五节:Jsp 跳转指令

jsp:forward 动作把请求转发到其它的资源。jsp:forward 标记只有一个属性 page。语法格式如下所示:

<jsp:forward page="相对 URL 地址" />

比如写一个jsp页面

<jsp:forward page="target.jsp"><jsp:param value="java1234" name="userName"/><jsp:param value="123456" name="password"/>
</jsp:forward>

在服务器内部跳转后的页面获取username和password的值(因为是服务器内部跳转,url显示不变,用户感受不到的)

服务器内部跳转后的页面<br/>
userName:<%=request.getParameter("userName") %><br/>
password:<%=request.getParameter("password") %><br/>

服务器内部跳转,可带参数; 客户端

第三章 JSP 九大内置对象及四个作用域

第一节:Jsp 九大内置对象及四大作用域概述

| 对象 | 描述 | | ----------- | ------------------------------------------------------------ | | request | HttpServletRequest 类的实例 | | response | HttpServletResponse 类的实例 | | out | JspWriter 类的实例,用于把结果输出至网页上 | | session | HttpSession 类的实例 | | application | ServletContext 类的实例,与应用上下文有关 | | config | ServletConfig 类的实例 | | pageContext | PageContext 类的实例,提供对 JSP 页面所有对象以及命名空间的访问 | | page | 代表页面本身,类似于 Java 类中的 this 关键字 | | exception | Throwable 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |

Jsp隐式对象又叫内置对象,是web服务器给jsp页面提供的对象,我们可以直接使用这些对象.9个隐式对象分为如下几类:

第1类:作用域对象

作用域即作用范围,作用域对象有4个:request,session,page,application

第2类:输出对象,out

第3类:响应对象,response

第4类:其它对象,config,pageContext和exception

第二节:Jsp 四大作用域

Page 范围:只在一个页面中保存数据; javax.servlet.jsp.PageContext(抽象类)
Request 范围:只在一个请求中保存数据; javax.servlet.http.HttpServletRequest(接口)
Session 范围:在一次会话范围中保存数据,仅供单个用户使用;javax.servlet.http.HttpSession(接口)
Application 范围:在整个服务器上保存数据,所有用户共享;javax.servlet.ServletContext(接口)

request:请求对象,代表一次请求,它的作用域是一次请求,在request中存储的数据只能在一次请求中共享. 存数据的方法setAttribute(String name,Object value),取数据方法:

​ getAttribute(String name).只能在请求转发时,才能获取到request中的数据。

session:代表会话对象,会话就是浏览器和服务器之间多次请求和响应的过程。在session中存储的数据可以在多个请求中共享.

存数据: session.setAttribute("username", "李四");取数据:
String username=(String) session.getAttribute("username");

application:代表web应用本身,即整个web项目的上下文执行环境.它的作用域是整个web项目,只要web服务器没有关闭,web项目就能访问,application就起作用.保存在application中的数据只要服务器没有关闭,就能够被所有会话共享。一个application包含多个会话。

page:代表当前页面自身。Page域中的数据只能在当前页面中共享,它的作用域是当前页面.

输出对象:out

out的println():此方法在输出内容后不会换行,而是产生一个空格
out的print():此方法可以输出任意类型的值
out的write():此方法只能输出字符数据,要么是字符串,要么是字符

例如:

<%out.print("aaaa");out.println("bbbb");out.println("cccc");out.write(97); //输出小写字母a%>

响应对象:response

第三节:response 对象

Response 内置对象和 request 内置对象是相对应的,response 内置对象用于响应客户请求,向客户端输出信息;
javax.servlet.HttpServletResponse 接口
1,自动刷新应用
2,页面重定向应用 客户端跳转
3,操作 cookie 应用 post get 方法比较 post 放数据包里 get 放 Url 后面 get 数据量小,不安全;
4,cookie 和 session 的比较 cookie 信息是存客户端的,session 信息是存服务器的;

第四节:out 对象

Out 内置对象主要用来向客户端输出各种类型的数据,同时还可以管理应用服务器上的输出缓冲区。所以 out 内
置对象的方法是向客户端输出数据和管理缓冲区; 底层 javax.servlet.jsp.JspWriter 抽象类

第五节:config 对象

Config 内置对象是 JSP 页面通过 JSP 容器进行初始化时被传递的对象。javax.servlet.ServletConfig 。在 Servlet
初始化的时候,JPS 引擎通过 config 向它传递信息。这种信息可以是属性名和属性值匹配的参数,也可以是通过
ServletContext 对象传递的服务器的有关信息;

第六节:exception 对象

Exception 内置对象用来处理 JSP 文件在执行时发生的所有异常,它是 java.lang.Throwable 类的一个对象。

第七节:pageContext 对象

pageContext 内置对象是一个比较特殊的对象。它相当于页面中所有对象功能的集合,即使用它可以访问到本页面
中所有对象。pageContext 内置对象由 Jsp 容器创建并初始化,pageContext 对象提供了对 JSP 页面所有对象及控件的访问。

(附):jsp表单处理

我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据

1.GET 方法

get方法将请求的编码信息添加在网址(url)后面,网址与编码信息通过"?"号分隔。如下所示:

http://www.sxt.com/hello?key1=value1&key2=value2

GET 方法是浏览器默认传递参数的方法,它产生一个长字符串出现在地址栏中。如果你要把密码或其他敏感信息传递到服务器,那么不要使用 GET 方法。

注意:用 get 时,传输数据的大小有限制(注意不是参数的个数有限制),最大为1024 字节。

以下是一个简单的 URL,并使用 GET 方法向 main.jsp 传递 URL 中的参数:

http://localhost:8080/testjsp/main.jsp?name=武汉尚学堂&url=http://www.sxt.com

main.jsp接收url中的参数:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'main.jsp' starting page</title> </head>
<body>
<h1>接收GET 方法提交的数据</h1>
<ul><li><b>站点名:</b><!-- 解决中文乱码问题 --><% String name=new String(request.getParameter("name").getBytes("ISO8859-1") ,"UTF-8"); %><%=name%></li><li><b>网址:</b><%=request.getParameter("url")%></li> </ul>
</body>
</html>

访问 main.jsp 的输出结果:

也可使用表单来提交参数:
<form action="main.jsp" method="GET">
站点名: <input type="text" name="name"><br />
网址: <input type="text" name="url" /><br />
<input type="submit" value="提交" /></form>

针对GET提交,如果请求参数的值是中文,会产生乱码。

解决GET提交的中文乱码问题的方法有2种:

第1种:将获取的参数值先转换为byte[],再封装成新的字符串

<%//获取请求参数的值String sitename=  request.getParameter("sitename");String url=  request.getParameter("url");sitename= new String(sitename.getBytes("ISO8859-1"),"UTF-8");  %>

第2种:修改server.xml文件(直接找到Servers项目下的sever.xml去修改),在

Connector节点上添加一个属性URIEncoding=”UTF-8”

2 POST 方法

一些敏感信息,如密码等我们可以通过 POST 方法传递,POST 提交数据是隐式的。

POST 提交数据是不可见的,GET 是通过在 url 里面传递的(可以看一下你浏览器的地址栏)。

使用表单的POST方法案例:

将上面表单的 method 改为 post 后提交到 main.jsp,main.jsp 代码:

<h1>接收 POST 方式提交的数据</h1>
<ul><li> <b>站点名:</b><!-- 解决中文乱码问题 -->< %request.setCharacterEncoding("UTF-8") ;String name=request.getParameter("name") ;%><%=name%></li><li><b>网址:</b><%=request.getParameter("url")%></li>
</ul>

解决POST提交的中文乱码问题:在第一次获取请求参数的代码前加上request.setCharacterEncoding("UTF-8");

例如:

<%//解决POST请求的中文乱码request.setCharacterEncoding("UTF-8");//获取请求参数的值String sitename = request.getParameter("sitename");String url = request.getParameter("url");%>

3读取表单数据

getParameter(): 使用 request.getParameter() 方法来获取一个表单参数的值。

getParameterValues(): 获得一组表单参数的值,比如得到 checkbox(名字相同,但值有多个)的一组数据。

getParameterNames():该方法可以取得所有参数的名称,该方法返回一个 Emumeration。

例子:拿到checkbox的数据

表单里有一组 checkbox,它们的 name 相同:

<input type=*"checkbox"* name=*"hobby"* value=*"run"* />跑步
<input type=*"checkbox"* name=*"hobby"* value=*"swim"* />游泳
<input type=*"checkbox"* name=*"hobby"* value=*"sing"* />唱歌<br/>

提交到 main2.jsp 后,拿到 checkbox 选中的值:

<h1>从复选框中读取数据</h1>
< %request.setCharacterEncoding("UTF-8") ;//hobby 是 checkbox 的 name,拿到同名的一组参数值String[] hobbys = request.getParameterValues("hobby") ; String myHobbys = "";for (int i = 0; i < hobbys.length; i++) { myHobbys += hobbys[i] + ",";
}
%>
<%=myHobbys%>

总结:获取请求参数的值有2个方法

getParameter(String name): 获取一个请求参数的值, name是请求参数名

getParameterValues(String name):获取一组请求参数的值,针对表单中的checkbox就用这个方法获取同名称的多个checkbox选中的一组值

<%//解决POST请求的中文乱码request.setCharacterEncoding("UTF-8");//获取请求参数的值String sitename = request.getParameter("sitename");String url = request.getParameter("url");String[]  citys=request.getParameterValues("city");for(String str:citys){out.print("校区:"+str+"<br>");  }%>

(附)学生信息crud项目

在昨天项目的基础上,加入学生信息的添加,修改,删除功能

A)添加学生

添加学生的步骤如下:

1)在列表页面上给出添加的超链接

<a href="add.jsp">添加学生</a>

2)在添加页面add.jsp上用一个表单来收集输入的学生信息

<h2>添加学生</h2><form action="doAdd.jsp"  method="post">姓名:<input type="text" name="sname"><br>性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>年龄:<input type="text" name="age"><br><input type="submit" value="添加"></form>

2)在doAdd.jsp上处理添加学生的请求

<%//处理添加请求的步骤://1.获取表单中的所有请求参数的值//解决post请求的中文乱码request.setCharacterEncoding("UTF-8");String sname = request.getParameter("sname");String sex = request.getParameter("sex");int age = Integer.parseInt(request.getParameter("age"));//2.把参数的值封装成学生对象Student stu = new Student(sname, sex, age);//3.调用dao里面的insert方法,完成添加StudentDao stuDao = new StudentDaoImpl();int i = stuDao.insert(stu);if (i > 0) {//添加成功,重新请求list.jspresponse.sendRedirect("list.jsp");}
%>

A)修改学生

修改学生的步骤如下:

**1)在列表页面list.jsp上每一行学生数据后都加上修改超链接,将id参数传递到update.jsp上

<a href="update.jsp?sid=<%=stu.getSid()  %>">修改</a>

2)在updte.jsp页面上回显学生信息

<%//获取要修改的学生的idint id=Integer.parseInt( request.getParameter("sid")) ;//根据id查询一个学生对象StudentDao  stuDao=new StudentDaoImpl();Student stu= stuDao.queryById(id);%>
<form action="doUpdate.jsp"  method="post"><!-- 在修改页面上要回显学生编号,有2种方式: 1)用只读的文本框    2)用隐藏域 -->编号:<input type="text" name="sid" value="<%=stu.getSid()%>"  readonly><br>姓名:<input type="text" name="sname"  value="<%=stu.getSname() %>"><br>性别:<input type="radio" name="sex" value="男"   <%=stu.getSex().equals("男")?"checked":"" %>>男<input type="radio" name="sex" value="女" <%=stu.getSex().equals("女")?"checked":"" %>>女<br>年龄:<input type="text" name="age"  value="<%=stu.getAge()%>"><br><input type="submit" value="修改"></form>

**回显:就是把原始数据再显示一次,如果是输入框(文本框,密码框),就用value属性来回显 value="xxx";如果是radio,就用checked来回显;如果是下拉列表框select,用selected来回显

2)**在doUpdate.jsp上处理修改请求

<%//防止POST请求的乱码request.setCharacterEncoding("UTF-8");//获取表单中的参数值String sname = request.getParameter("sname");String sex = request.getParameter("sex");int age = Integer.parseInt(request.getParameter("age"));//获取sidint sid = Integer.parseInt(request.getParameter("sid"));//把参数的值封装成学生对象Student stu = new Student(sname, sex, age);stu.setSid(sid);//调用dao里的修改方法,完成修改StudentDao stuDao = new StudentDaoImpl();int i = stuDao.update(stu);if (i > 0) {//修改成功,重新请求list.jspresponse.sendRedirect("list.jsp");}%>

A)删除学生

删除学生的步骤如下:

1).在列表页面list.jsp每一行学生数据后添加一个删除的超链接,让它只响应js事件,不要发生跳转

<a href="javascript:void(0)"  onclick="deleteById(<%=stu.getSid()  %>)">删除</a>

Js函数

<script>function deleteById(id){//使用confirm弹出一个确认取消对话框var flag=   confirm("是否确认删除此信息?");if(flag){//发请求给jsp页面去处理删除,相当于get请求, location.href:改变(设置)地址栏上的urllocation.href="doDelete.jsp?sid="+id;}}</script>

2)doDelete.jsp页面上处理删除请求

<%int sid=Integer.parseInt(request.getParameter("sid"));//调用Dao里的删除方法,完成删除StudentDao  stuDao=new StudentDaoImpl();int i= stuDao.delete(sid);if(i>0){//删除成功,重新请求list.jspresponse.sendRedirect("list.jsp");}%>

第四章 JavaBean 组件

第一节:Javabean 组件引入

JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个
JSP 代码的开发更简洁。

第二节:jsp:useBean 创建 javabean

<jsp:useBean id="实例化对象名称" scope="保存范围" class="类完整名称"/>
Scope,一共有 page,request,session 和 application4 个属性范围,默认是 page;
<jsp:useBean id="people" scope="page" class="com.dys.model.People"/>
//本页获取属性<%
//People people=new People();
people.setId(1);
people.setName("傻逼2");
people.setAge(20);
%><h1>编号:<%=people.getId() %></h1>
<h1>姓名:<%=people.getName() %></h1>
<h1>年龄:<%=people.getAge() %></h1>
----------------------------------------------------------------
//提交到新的页面获取
<form action="people.jsp" method="post"><table><tr><td>编号</td><td><input type="text" name="id"></td></tr><tr><td>姓名</td><td><input type="text" name="name"></td></tr><tr><td>年龄</td><td><input type="text" name="age"></td></tr><tr><td></td><td></td></tr><tr><td colspan="2"><input type="submit" value="提交"></td></tr></table>
</form>

获取页面

<%
request.setCharacterEncoding("UTF-8");
int id=Integer.parseInt(request.getParameter("id"));
String name=request.getParameter("name");
int age=Integer.parseInt(request.getParameter("age"));
People people =new People();
people.setId(id);
people.setName(name);
people.setAge(age);%>
<h1>编号:<%=people.getId() %></h1>
<h1>姓名:<%=people.getName() %></h1>
<h1>年龄:<%=people.getAge() %></h1>

第三节:jsp:setProperty 设置 javabean 属性值

<jsp:setProperty property="属性名称" name="实例化对象的名称" value="属性值" param="参数名称"/>
Property=”*” 自动匹配所有

例子:

提交页面代码

<jsp:useBean id="people" scope="page" class="com.dys.model.People"/>
<form action="people1.jsp" method="post"><table><tr><td>编号</td><td><input type="text" name="id"></td></tr><tr><td>姓名</td><td><input type="text" name="name"></td></tr><tr><td>年龄</td><td><input type="text" name="age"></td></tr><tr><td></td><td></td></tr><tr><td colspan="2"><input type="submit" value="提交"></td></tr></table>
</form>

获取页面代码

<%request.setCharacterEncoding("UTF-8");%>
<jsp:useBean id="people" scope="page" class="com.dys.model.People"/>
<jsp:setProperty property="*" name="people"/><h1>编号:<%=people.getId() %></h1>
<h1>姓名:<%=people.getName() %></h1>
<h1>年龄:<%=people.getAge() %></h1>

第四节:jsp:getProperty 获取 javabean 属性值

<jsp:getProperty property="属性名称" name="实例化对象的名称"/>

以上<%-- --%>是获取所有值自动匹配. *代表所有

<jsp:setProperty property="id" name="people"/>   //匹配id
<jsp:setProperty property="name" name="people" value="张三"/>
//匹配姓名  手动设为张三
<jsp:setProperty property="age" name="people" value="100"/>   //匹配年龄设为100

在本页获取

<%request.setCharacterEncoding("UTF-8");%>
<jsp:useBean id="people" scope="page" class="com.dys.model.People"/><%
people.setId(1);
people.setName("张三");
people.setAge(20);
%>
<h1>编号:<jsp:getProperty property="id" name="people"/></h1>
<h1>姓名:<jsp:getProperty property="name" name="people"/></h1>
<h1>年龄:<jsp:getProperty property="age" name="people"/></h1>

第五节:javabean 的保存范围

Javabean 的保存范围有 page,request,session.application,默认是 page;

第六节:javabean 删除

Page 范围:pageContext.removeAttribute(“javaBean Name”);
request 范围:request.removeAttribute(“javaBean Name”);
session 范围:session.removeAttribute(“javaBean Name”);
application 范围:application.removeAttribute(“javaBean Name”);

第五章 Servlet 开发

1.servlet 引入

​ 百度百科:servlet

2.Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载--->实例化--->服务--->销毁。

3.客户端跳转 VS 服务器端跳转

1,在 Servlet 中获取 session,application
2,客户端跳转 response.sendRedirect("目标地址");
3,服务器跳转:RequestDispatcher rd=request.getRequestDispatcher("目标地址"); rd.forward(request,

第六章 EL 表达式

1.el表达式简介和获取数据

表达式语言(Expression Language,EL) 百度百科:el

EL获取数据的语法:${标识符},用于获取作用域中的数据,包括简单数据和对象的数据。

1.1.获取简单数据: 简单数据指非对象类型的数据,比如String,Integer,基本类型等

获取简单数据的语法:${key},key就是存数据的关键字或属性名,数据通常要保存在作用域对象中,EL在获取数据时,会依次从page,request,session,application域对象中查找数据,找到了就返回数据,找不到就返回空字符串

1.2EL获取javaBean对象的数据, javaBean是普通的java对象,一个类中只要有公共无参构造方法,私有属性及对应的getXxx(),setXxx()方法,则该类就是一个javaBean类,它的对象就是javaBean对象。

获取javaBean对象数据的语法:${存对象的key.属性名}

获取javaBean对象的数据:id:${user.id },username:${user.username },address:${user.address }

1.3EL获取javaBean对象数据的本质

EL获取javaBean对象的数据语法:${对象的http://key.xxx},本质就是在调用xxx对应的getXxx()方法,xxx可以是类中存在的属性,也可以不是类中的属性.

例如:${user.username},其实是在调用对象的username属性对应的getUsername()

当然,${对象的http://key.xxx},此时xxx可以不是javaBean类中的属性,只要类中存在getXxx()就可以了

1.4EL访问javaBean对象的关联对象的数据

获取javaBean对象的关联对象的数据,语法:${javaBean对象的key.关联对象名.xxx}

例如:

职位名:${user.job.name },薪水:${user.job.salary }

1.5 EL访问List集合指定位置的数据

<%List<String>  list=new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");//把集合存到request域对象中request.setAttribute("strList", list);%>
获取List集合中指定位置的数据:${strList[1] }

1.6 EL访问Map集合指定key的数据

语法:${存map集合的key. 指定key}

例如:

<%
Map<String,String>  map=new HashMap<String,String>();map.put("a", "111");map.put("b", "222");map.put("c", "333");//把Map集合存到request域对象中request.setAttribute("map", map); %>
获取Map集合中指定key的数据: ${map.b }<br>

注意:如果Map集合中的key是标准命名(不是以数字开头或者全数字),那么就用.符号来获取指定key的数据;如果key不是标准命名,此时就不能用.符号,要换成[“key”]

例如

${map["11"] }

所有能用.语法的都可以换成[“key”]语法,即[“key”]适用于所有的key

例如:${map["c"]}

2.el表达式内置对象

表达式内置对象             说明
1 pageContext           表示 javax.servlet.jsp.PageContext 对象
2 pageScope             表示从 page 属性范围查找输出属性
3 requestScope          表示从 request 属性范围查找输出属性
4 sessionScope          表示从 session 属性范围查找输出属性
5 applicationScope      表示从 application 属性范围查找输出属性
6 param                 接收传递到本页面的参数
7 paramValues           接收传递到本页面的一组参数
8 header                取得一个头信息数据
9 headerValues          取出一组头信息数据
10 cookie               取出 cookie 中的数据
11 initParam            取得配置的初始化参数

3.el表达式4种范围属性

<%pageContext.setAttribute("info1","page范围的值");request.setAttribute("info1","request范围的值");session.setAttribute("info1","session范围的值");application.setAttribute("info1","application范围的值");
%>
${info1 }</h1>
<%-- <h1>${info2 }</h1>
<h1>${info3 }</h1>
<h1>${info4 }</h1>
寻找值的顺序:page->request->session->application

4.el表达式接受请求参数

Param:单个参数
paramValues:一组参数

设置表单

<form action="el2.jsp" method="post">
<input type="text" name="name"/>
<input type="submit" value="提交el2.jsp"/>
</form>
<a href="el2.jsp?age=12">提交el2.jsp</a>
<form action="el2.jsp" method="post">
<input type="checkbox" name="hobby" value="java语言"/>java语言
<input type="checkbox" name="hobby" value="C#语言"/>C#语言
<input type="checkbox" name="hobby" value="php语言"/>php语言
<input type="submit" value="提交el2.jsp"/>
</form>

获取表单的值

<%request.setCharacterEncoding("utf-8");
%>
<h1>姓名:${param.name }</h1>
<h1>年龄:${param.age }</h1>
<h1>爱好一:${paramValues.hobby[0] }</h1>
<h1>爱好二:${paramValues.hobby[1] }</h1>
<h1>爱好三:${paramValues.hobby[2] }</h1>

5:EL 表达式对象操作

以一个对象小例子为例

1.先用java编写一个对象,字段 int id,String name,int age

js代码如下

<%People zhangsan=new People();zhangsan.setId(1);zhangsan.setName("张三");zhangsan.setAge(20);request.setAttribute("zhangsan",zhangsan);
%>
<h1>编号:${zhangsan.id }</h1>
<h1>姓名:${zhangsan.name }</h1>
<h1>年龄:${zhangsan.age }</h1>

6:EL 表达式集合操作

以一个list集合为例

<%List all=new LinkedList();all.add(0,"元素一");all.add(1,"元素二");all.add(2,"元素三");request.setAttribute("all",all);
%>
<h1>${all[0] }</h1>
<h1>${all[1] }</h1>
<h1>${all[2] }</h1>

7:EL 表达式运算符操作

算数运算符:+,-,*,/,%

关系运算符,

| 关系运算符 | 别名 | | ---------- | ---- | | > | gt | | >= | ge | | < | lt | | <= | le | | == | eq | | != | ne |

逻辑运算符;

| 逻辑运算符 | 别名 | | ---------- | ---- | | && | and | | || | or | | ! | not |

三目运算符; 语法: ${e1?e2:e3 },如果e1成立,执行e2,否则执行e3

<%request.setAttribute("user", "mike");%>${user==null?"用户未登录":"用户已登录" }

特殊运算符

empty 判断 EL 表达式中的对象是否为 null(空)或者字符串是否为空串,也可判断集合是否为空集

1)如果字符串为空串,返回true,否则返回false

2)如果对象为null,返回true,否则返回false

3)如果集合为空集,返回true,否则返回false

<%request.setAttribute("num1",10);request.setAttribute("num2",3);request.setAttribute("flag1",true);request.setAttribute("flag2",false);
%>
<h1>算数运算符</h1>
<h2>num1=${num1 },num2=${num2 }</h2>
<h2>num1+num2=${num1+num2 }</h2>
<h2>num1-num2=${num1-num2 }</h2>
<h2>num1*num2=${num1*num2 }</h2>
<h2>num1/num2=${num1/num2 }</h2>
<h2>num1%num2=${num1%num2 }</h2>
<h2>num1*(num1-num2)=${num1*(num1-num2) }</h2>
<h1>关系运算符</h1>
<h2>flag1=${flag1 },flag2=${flag2 }</h2>
<h2>与操作flag1 && flage2:${flag1 && flage2 }</h2>
<h2>或操作flag1 || flage2:${flag1 || flage2 }</h2>
<h2>非操作!flag1:${!flag1}</h2>
<h1>三目运算符</h1>
<h2>三目操作:num1>num2:${num1>num2?"yes":"no" }</h2>
<h1>empty关键字</h1>
<h2>判断空操作:${empty num1 }</h2>

3.获取web开发常用对象

EL中提供了11个隐含对象,可以通过他们去获取web开发中的常用对象

1.pageContext:通过它获取jsp页面上的pageContext对象

${pageContext.request.contextPath }:获取web应用的根路径,格式:/项目名

${pageContext.request.contextPath }在项目中的实际作用:

解决某些IDE不支持../访问的问题,先用${pageContext.request.contextPath }获取到项目的根路径,然后再在根路径后面接上要访问的url,此时是用绝对路径来访问的

例如:

<a href="${pageContext.request.contextPath }/index.jsp">跳转到项目根路径下的index.jsp</a>

1.XxxScope:xxx就是4个作用域对象,它们是代表xxx域对象中保存属性数据的Map对象,setAttribute()方法就相当于Map对象的put()方法. 实际项目中,当多个作用域对象中使用了同名的key来存储数据时,为了能够把每个作用域对象中的数据分别获取出来,此时就要在key前面加上xxxScope前缀

<%//向4个作用域对象中保存属性数据pageContext.setAttribute("book", "三国演义");request.setAttribute("book", "西游记");session.setAttribute("book", "水浒传");application.setAttribute("book", "红楼梦");%><!-- EL获取数据时,按照作用域从小到大的顺序,分别从4个作用域对象中查找数据,找到了就返回数据,找不到返回空串 -->${book }<br>获取page域中名为book的数据:${pageScope.book}<br>获取request域中名为book的数据:${requestScope.book}<br>获取session域中名为book的数据:${sessionScope.book}<br>获取application域中名为book的数据:${applicationScope.book}<br>

总结:在访问作用域对象中的数据时,在key前面加上XxxScope前缀,就是在告诉jsp引擎要到哪个作用域对象中查找指定key的数据(直接定位到作用域对象中去查找)。

1.param:代表保存了所有请求参数的Map对象,Map中的key就是请求参数的名称。用${param.请求参数名}来获取请求参数的值

用户名:${param.username },姓名:${param.realname }

尽量用EL来消除jsp页面上的脚本代码

EL中的关键字和保留字

以上表中,有3个是保留字 instanceof ,div,mod

div是算术运算符”/”的别名,mod是”%”的别名。

以后我们在使用作用域对象来存数据时,key要避开上面的关键字和保留字

第七章 Jsp 自定义标签(列出来,不写,只是让大纲更加舒服)

第八章 Jsp 标准标签库

1.JSTL 引入

JSTL即jsp标准标签库,是一组标签的集合。

使用前需要先在项目中导入jar包jstl-1.2.jar,再在页面上引入标签库

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

2.JSTL 核心标签库

c:out 内容输出标签;
c:set 用来设置 4 中属性范围值的标签;
c:remove 用来删除指定范围中的属性;
c:catch 用来处理程序中产生的异常;
c:if 用来条件判断;
c:choose、c:when、c:otherwise 用来多条件判断;
c:forEach 用来遍历数组或者集合;
c:fortokens 分隔输出;
c:import 导入页面;
c:url 生成一个 url 地址;
c:redirect 客户端跳转

1)流程控制标签if

<c:if test="${age gt 18 }">已成年!</c:if>

2)流程控制标签choose,when,otherwise

choose,when,otherwise标签:这3个标签要配合使用,构成java中的

​ if..elseif..elseif..else的结构.choose要作为when和otherwise的父标签。

<c:set var="score" value="79"></c:set>
<!--        如果分数>=80,输出优秀,分数>=60且<80,输出良好,60以下输出“不及格”  --><c:choose><c:when test="${score ge 80}">优秀</c:when><c:when test="${score ge 60 and score lt 80}">良好</c:when><c:otherwise>不及格</c:otherwise></c:choose>

3)循环标签forEach

forEach标签:用来遍历集合(数组)中的元素,var和items是必需的

<!-- forEach标签:对集合(数组)进行迭代操作,两个必需的属性:1.var:指定每次从集合中取出的元素的名称   2.items:指定要遍历的集合.jsp引擎会将当前遍历出的那个元素保存到page域对象中,key就是元素的名称,value就是元素本身:pageContext.setAttribute(var,元素)注意:不要把var和items的值写成相同的单词--><table border="1" width="50%" cellpadding="10" cellspacing="0"><tr><th>编号</th><th>用户名</th><th>地址</th></tr><c:forEach var="user" items="${userList }"><tr><td>${pageScope.user.id}</td><td>${pageScope.user.username }</td><td>${user.address }</td></tr></c:forEach></table>

forEach标签的可选属性:4个

1.varStatus:设定状态变量,用于保存集合中元素的状态信息,

​ varStatus有4个状态属性: index(获取当前循环的索引值) count(当前循环的次数) first(是否是第一个位置) last(是否为最后一个位置)

​ 2.begin:循环(遍历)的开始位置

​ 3.end:遍历的结束位置,如果只有begin属性,没有end属性,则从begin开始一直遍历到最后

​ 4.step:每次增加或减少的量(索引的增加或减少量),默认值是1

例如:

<c:forEach var="user" items="${userList }" varStatus="st" step="3"><tr><td>索引:${st.index },循环次数:${st.count },${st.first }</td><td>  ${pageScope.user.id}</td><td>${pageScope.user.username }</td><td>${user.address }</td></tr></c:forEach>

补充:forEach标签的特殊用法:输出一组连续有规律的数字

<!-- 使用forEach标签可以输出一组连续有规律的数字,只需要var,begin,endvar:每个数字的名称   begin:数字的初始值   end:数字的结束值例如:输出1-10的数字--><c:forEach var="sn" begin="1" end="10">${sn }<br></c:forEach>

4)循环标签forTokens

用来迭代分割后的字符串数组,它使用delims来指定使用什么分隔符来对字符串进行分割,再迭代分割后的字符串数组

<%String str="北京,上海,天津,重庆";pageContext.setAttribute("citys", str);%><c:forTokens var="city" items="${citys }" delims=",">${city }<br></c:forTokens>

改造上面的crud项目

把页面上的<%%>尽量的消除掉。

1)修改list.jsp页面,把for循环变成forEach标签

<%//创建StudentDao的对象StudentDao stuDao = new StudentDaoImpl();List<Student> list = stuDao.queryAll();//把集合保存到request域中request.setAttribute("stulist", list);%><c:forEach var="stu" items="${stulist }"><tr><td>${stu.sid }</td><td>${stu.sname }</td><td>${stu.sex }</td><td>${stu.age }</td><!-- javascript:void(0):禁用超链接的跳转行为,只响应js事件 --><td><a href="update.jsp?sid=${stu.sid }">修改</a>--<ahref="javascript:void(0)" onclick="deleteById(${stu.sid })">删除</a></td></tr></c:forEach>

1)修改update.jsp,把回显数据都改成EL

<%//获取要修改的学生的idint id=Integer.parseInt( request.getParameter("sid")) ;//根据id查询一个学生对象StudentDao  stuDao=new StudentDaoImpl();Student stu= stuDao.queryById(id);//存到request域中request.setAttribute("stu", stu);%><form action="doUpdate.jsp"  method="post"><!-- 在修改页面上要回显学生编号,有2种方式: 1)用只读的文本框    2)用隐藏域 -->编号:<input type="text" name="sid" value="${stu.sid}"  readonly><br>姓名:<input type="text" name="sname"  value="${stu.sname }"><br>性别:<input type="radio" name="sex" value="男"  ${stu.sex eq "男"?"checked":""} >男<input type="radio" name="sex" value="女" ${stu.sex eq "女"?"checked":""}>女<br>年龄:<input type="text" name="age"  value="${stu.age }"><br><input type="submit" value="修改"></form>

3.:JSTL 国际化标签库

fmt:setLocale 设定用户所在的区域;
fmt:formatDate 对日期进行格式化;
fmt:requestEncoding 设置所有的请求编码;
fmt:bundle fmt:message 读取国际化资源;
fmt:formatNumber 格式化数字;
fmt:formatDate 格式化日期;
fmt:timeZone 设置临时时区;

例子:补充:格式化标签库的使用

1)在页面上引入格式化标签库

<!-- 引入格式化标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

1)在页面上使用formatDate标签来格式化日期

<fmt:formatDate value="${now }"  pattern="yyyy-MM-dd HH:mm:ss"/>

4.:JSTL SQL 标签库

Sql:setDataDource 设置 JDBC 连接;
sql:query 数据库查询操作;
Sql:update 数据库添加,修改,删除操作;
Sql:transaction 数据库事务;

5.JSTL XML 标签库

x:parse 解析 xml;
x:out 输出 xml 文件的内容;
x:set 把 xml 读取的内容保存到指定的属性范围;
x:if 判断指定路径的内容是否符合判断的条件;
x:choose x:when x:otherwise 多条件判断;
x:forEach 遍历

6:JSTL 函数标签库

略;

exls下载后显示jsp_jsp笔记相关推荐

  1. exls下载后显示jsp_jsp利用POI直接生成Excel并在页面提示打开下载

    java中导出Excel有两个组件可以使用,一个是jxl,一个是POI,我这里用的是POI.导出是可以在服务器上生成文件,然后下载,也可以利用输出流直接在网页 中弹出对话框提示用户保存或下载.生成文件 ...

  2. exls下载后显示jsp_jsp页面点击连接,生成excel文件,然后下载

    Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该 API非Windows操作系统也可以通过纯Jav ...

  3. Thonny+Micropython ESP32固件下载后显示没有反应

    网上很流行的一个esp32开发板,芯片型号是WRoom32,4Mbit flash 在使用thonny,软件烧录固 件以后,报错,如图: Device is busy or does not resp ...

  4. MIPS广告牌发布节目后显示未下载,节目发布不成功

    环境: MIPS 版本号:MIPS_DS_Basic_v4.0.0.201905171600 深信服AC-1000-B1200 V.13.0 AC13.0.62 问题描述: mips广告牌发布节目后显 ...

  5. kali 解决Metasploit拿到shell后显示中文乱码问题

    拿到对方shell后显示的问题如下: 中文乱码解决: chcp 65001 然后 上传下载文件 转载于:https://www.cnblogs.com/chenglee/p/9110963.html

  6. magisk下载里显示没有模块_重大更新 | 仓耳云黑大字库amp;模块版本更新!

    点击上方"蓝字",轻松关注我! Changelog 更新日志 2020.1.17 采用仓耳官网下载的GB18030大字库版仓耳云黑字体,现在所有字重的仓耳云黑都是GB18030大字 ...

  7. python下载后是黑的_python下载文件记录黑名单的实现代码

    具体代码如下所示: #!/usr/bin/python # -*- coding: GBK -*- # -*- coding: UTF-8 -*- from ftplib import FTP imp ...

  8. python下载文件加上日期_Python实现给下载文件显示进度条和下载时间代码

    本篇文章小编给大家分享一下Python实现给下载文件显示进度条和下载时间代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 该模块调用了三个库: 1. ...

  9. python安装后如何使用-python如何安装下载后的模块

    Python中的内置模块可以直接使用,如os模块,sys模块. 使用第三方模块之前,需要先下载并安装该模块,然后就能像使用标准模块和自定义模块那样导入并使用了.因此,本节主要讲解如何下载并安装第三方模 ...

  10. 联想服务器id显示感叹号,网卡驱动安装后显示感叹号

    相关文章: 故障现象: 网卡驱动安装后显示感叹号,如图: 原因分析: 网卡驱动安装后显示有感叹号故障绝大部分仍是驱动安装错误导致,可通过重新下载并安装官网提供驱动或者通过第三方软件更新解决,亦或通过彻 ...

最新文章

  1. linux redis 设置日志,linux上redis怎么动态看日志
  2. python编程初学者指南pdf-Python物理建模初学者指南
  3. 7-49 打印学生选课清单 (25 分)(思路+详解+map做法(一对多)+超时解决)Come baby!
  4. [LOJ]体育成绩统计 / Score (无脑模拟,没有脑子,就是上!)
  5. 简单的GTK窗体搭建
  6. 互联网晚报 | 9月11日 星期六 | 魅蓝宣布正式回归;黑石集团终止收购SOHO中国;“小酒馆第一股”海伦司正式登陆港交所...
  7. Postman|Qt笔记-解决Could not get any response
  8. oracle 12c 创建PDB用户即Local User (PDB与CDB)
  9. 看雪 好文 汇集贴(持续更新)
  10. 1019 数字黑洞 (20)
  11. ACwing 829 模拟队列
  12. 虚拟机VMware插入U盘操作系统崩溃死机的解决方法
  13. 机器学习与数据挖掘之ROC与AUC
  14. BlenderGIS插件 城市建筑3D模型自动生成 教程
  15. 游戏机器人的开发工具及开发步骤
  16. java程序员语录_java程序员励志说说26条
  17. outlook服务器怎么访问文件夹路径,Outlook 2010更改OST存放位置及配置
  18. debian系linux更新时,提示“由于没有公钥,无法验证下列签名”
  19. HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)
  20. sa-token使用简单使用

热门文章

  1. 关于 LimitedConcurrencyLevelTaskScheduler 的疑惑
  2. SaltStack 拉取和推送文件
  3. linux驱动程序之电源管理之新版linux系统设备架构中关于电源管理方式的变更
  4. freemarker 标签循环list 以及获取下标值
  5. AJAX - 浏览器支持
  6. member selection 运算符是什么
  7. linux pae内核安装,CentOS6.9 32位 编译无 pae 内核
  8. 拓端tecdat|R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例
  9. 拓端tecdat|Python、R对小说进行文本挖掘和层次聚类可视化分析案例
  10. milantgh php安全,PHP漏洞全解(一)-PHP网站的安全性问题