exls下载后显示jsp_jsp笔记
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笔记相关推荐
- exls下载后显示jsp_jsp利用POI直接生成Excel并在页面提示打开下载
java中导出Excel有两个组件可以使用,一个是jxl,一个是POI,我这里用的是POI.导出是可以在服务器上生成文件,然后下载,也可以利用输出流直接在网页 中弹出对话框提示用户保存或下载.生成文件 ...
- exls下载后显示jsp_jsp页面点击连接,生成excel文件,然后下载
Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该 API非Windows操作系统也可以通过纯Jav ...
- Thonny+Micropython ESP32固件下载后显示没有反应
网上很流行的一个esp32开发板,芯片型号是WRoom32,4Mbit flash 在使用thonny,软件烧录固 件以后,报错,如图: Device is busy or does not resp ...
- MIPS广告牌发布节目后显示未下载,节目发布不成功
环境: MIPS 版本号:MIPS_DS_Basic_v4.0.0.201905171600 深信服AC-1000-B1200 V.13.0 AC13.0.62 问题描述: mips广告牌发布节目后显 ...
- kali 解决Metasploit拿到shell后显示中文乱码问题
拿到对方shell后显示的问题如下: 中文乱码解决: chcp 65001 然后 上传下载文件 转载于:https://www.cnblogs.com/chenglee/p/9110963.html
- magisk下载里显示没有模块_重大更新 | 仓耳云黑大字库amp;模块版本更新!
点击上方"蓝字",轻松关注我! Changelog 更新日志 2020.1.17 采用仓耳官网下载的GB18030大字库版仓耳云黑字体,现在所有字重的仓耳云黑都是GB18030大字 ...
- python下载后是黑的_python下载文件记录黑名单的实现代码
具体代码如下所示: #!/usr/bin/python # -*- coding: GBK -*- # -*- coding: UTF-8 -*- from ftplib import FTP imp ...
- python下载文件加上日期_Python实现给下载文件显示进度条和下载时间代码
本篇文章小编给大家分享一下Python实现给下载文件显示进度条和下载时间代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 该模块调用了三个库: 1. ...
- python安装后如何使用-python如何安装下载后的模块
Python中的内置模块可以直接使用,如os模块,sys模块. 使用第三方模块之前,需要先下载并安装该模块,然后就能像使用标准模块和自定义模块那样导入并使用了.因此,本节主要讲解如何下载并安装第三方模 ...
- 联想服务器id显示感叹号,网卡驱动安装后显示感叹号
相关文章: 故障现象: 网卡驱动安装后显示感叹号,如图: 原因分析: 网卡驱动安装后显示有感叹号故障绝大部分仍是驱动安装错误导致,可通过重新下载并安装官网提供驱动或者通过第三方软件更新解决,亦或通过彻 ...
最新文章
- linux redis 设置日志,linux上redis怎么动态看日志
- python编程初学者指南pdf-Python物理建模初学者指南
- 7-49 打印学生选课清单 (25 分)(思路+详解+map做法(一对多)+超时解决)Come baby!
- [LOJ]体育成绩统计 / Score (无脑模拟,没有脑子,就是上!)
- 简单的GTK窗体搭建
- 互联网晚报 | 9月11日 星期六 | 魅蓝宣布正式回归;黑石集团终止收购SOHO中国;“小酒馆第一股”海伦司正式登陆港交所...
- Postman|Qt笔记-解决Could not get any response
- oracle 12c 创建PDB用户即Local User (PDB与CDB)
- 看雪 好文 汇集贴(持续更新)
- 1019 数字黑洞 (20)
- ACwing 829 模拟队列
- 虚拟机VMware插入U盘操作系统崩溃死机的解决方法
- 机器学习与数据挖掘之ROC与AUC
- BlenderGIS插件 城市建筑3D模型自动生成 教程
- 游戏机器人的开发工具及开发步骤
- java程序员语录_java程序员励志说说26条
- outlook服务器怎么访问文件夹路径,Outlook 2010更改OST存放位置及配置
- debian系linux更新时,提示“由于没有公钥,无法验证下列签名”
- HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)
- sa-token使用简单使用
热门文章
- 关于 LimitedConcurrencyLevelTaskScheduler 的疑惑
- SaltStack 拉取和推送文件
- linux驱动程序之电源管理之新版linux系统设备架构中关于电源管理方式的变更
- freemarker 标签循环list 以及获取下标值
- AJAX - 浏览器支持
- member selection 运算符是什么
- linux pae内核安装,CentOS6.9 32位 编译无 pae 内核
- 拓端tecdat|R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例
- 拓端tecdat|Python、R对小说进行文本挖掘和层次聚类可视化分析案例
- milantgh php安全,PHP漏洞全解(一)-PHP网站的安全性问题