1,定义
JSP即Java+html,最终会成为一个servlet
public class TestAction extends Httpservlet(){}
最终会编译成 .class文件 .class存在tomact下面的work文件下
2,JSP的使用
(1)HTML代码:直接在JSP页面正常书写即可(CSS,JAVASCRIPT);
(2)Java代码:
java代码一定是写在<%%>中的 这个是一定要有;
输出java代码中的值<%=%> 这个一定不能写;
Java方法写在<%!%>中
(3)练习:使用上述的三个java代码书写格式来进行书写:
写一个for循环
<body>
<!-- 写一个for循环 -->
<%
for(int i=0;i<10;i++){
%>
<%=i+1 %>
<%
}
%>
</body>
(4)JSP中的注释
<!--HTML的注释-->:如果有java代码的话,不会显示在页面,但是会执行;
<%--JSP的注释--%>:如果有java代码的话,即不会在页面显示,也不会进行执行;
3,JSP注释
两种JSP注释
<!--注释内容-->
此种注释是会自动发布到客户端的,在浏览器上查看页面源代码就可以看见注释内容ctrl+shift+/
<%--注释内容--%>
此种注释会被JSP引擎自动忽略,不会被发送到客户端.无快捷键
4,Jsp指令的书写**
1,定义:所谓指令,就是告诉jsp引擎,在将.jsp文件转为.java的时候,需要做一些什么样的额外处理,可以理解为是声明;
2,指令的语法:<%@ 指令名 属性名=属性值%>
3,常用的指令:
(1)Page指令:
a),import:用于导包的,可以一次性导入多个包,中间用逗号隔开,也可以使用多次page指令来进行导包;
b),pageEncoding:告诉JSP引擎,JSP文件保存的时候应该采用的编码格式;
c),contentType:等价于response.setContentType();
(2)include指令
<%@include file=“second.jsp” %>
这个指令里面最主要的属性是file,用来表示这个页面中要包含哪个页面,但是一定要注意,当一个jsp中使用include指令来包含另外一个jsp的时候,那么这两个jsp会通过tomcat的引擎所转为的java文件拼凑在一起,即不能在两个jsp中声明相同的变量名,并且jsp中变量可以直接在主jsp中去使用,因为他们本来就在一个java文件中;
案例:把first.jsp与second.jsp两个jsp内容放在一个页面
<--first.jsp里的内容-->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="second.jsp" %>
<body>
这是第一个JSP页面,我要包含第二个JSP, <br>
</body>
<--first.jsp里的内容-->
<body>
这是第二个JSP页面<br>
</body>
启动tomact运行http://localhost:8080/JspDemo03/index.jsp
结果如下:
5, JSP的运行机制
(1) 当容器接受到一个JSP的请求时,先查找这个JSP页面是否存在;
(2) 如果存在的话,容器就会调用JSP引擎,(将.jsp文件转为了.java文件);这个java文件实质上就是一个servlet;
(3)将这个java文件(即servlet)进行编译,创建servlet实例,JSP生成的java文件在Tomcat的安装目录的work目录下并且执行;
注:
JSP如何转换为java文件
HTML标签:直接放到service方法中的out.write(“html标签”);
Java代码:直接在servlet中原样输出;
Java的结果:放到了service方法里的out.print(java的结果);
6, url如何传值
(1)从一个Jsp跳转到另一个Jsp
在jsp后面加上一个?
<a href="aa.jsp?变量名sbq=变量值sbs"></a>
如果我们要传两个值怎么办
<a href="aa.jsp?变量名=变量值sbs&变量名2=变量值"></a>
如果再想多传一个,就再加一个&
<body>
<a href="urlDemo02.jsp?name1=孙悟空喜欢吃桃&name2=gggdgdg&name3=gvcgvcv">孙悟空喜欢吃桃</a>
<a href="urlDemo02.jsp?name=唐僧喜欢念经">唐僧喜欢念经</a>
<a href="urlDemo02.jsp?name=八戒喜欢睡觉">八戒喜欢睡觉</a>
<a href="urlDemo02.jsp?name=沙僧喜欢干活">沙僧喜欢干活</a>
<a href="http://baidu.com">跳转到百度</a>
</body>
<body>
<%
String name3=(String)request.getParameter("name3");
String name1=(String)request.getParameter("name1");
String name2=(String)request.getParameter("name2");
%>
获得的值是:<%=name3 %><br>
获得的值是:<%=name1 %><br>
获得的值是:<%=name2 %>
</body>
(2),跳转到百度的四种方法:
第一种
<a href="http://baidu.com">第一种跳转到百度</a><br>
第二种
<a href="javascript:window.location='http://baidu.com'">第二种跳转到百度</a><br>
第三种,写一个函数
<head>
<script type="text/javascript">
function add(){
window.location="http://baidu.com"; }
</script>
</head>
<a href="javascript:add();">第三种跳转到百度</a><br>
第四种
<head>
<script type="text/javascript">
function add(){
location.href="http://baidu.com"; }
</script>
</head>
<a href="javascript:add();">第四种跳转到百度</a><br>
第五种
<head>
<script type="text/javascript">
function add(){
document.getElementById("form1").submit();
}
</script>
</head>
<form id="form1" action="http://baidu.com">
</form>
<a href="javascript:add();">第五种跳转到百度</a><br>
执行逻辑:
<head>
<script type="text/javascript">
//跳转到查询所有
function list(){
document.getElementById("form1").submit();
}
</script>
</head>
<body>
<form id="form1" action="<%=request.getContextPath()%>/userList.do">
</form>
<a href="javascript:list();">查询出所有数据</a><br>
</body>
通过xml跳转到 userList.jsp
7,JSP内置对象:
session对象
session在网络中被称为对话。由于HTTP协议是一种五协议状态,也就是当浏览器向服务器发出请求后,服务器接受请求,并返回响应值后,该连接就结束了,而服务器并不保存相关的信息,为了改变这一缺点,HTTP协议提供了session,通过session可以在应用程序的Web页面进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭服务器。
但是,如果在一个会话中,客户端长期不向服务器发送请求,session会自动消失,这个实践取决于服务器,可以修改。
8.URL
注:URL属于URI
(1)@WebServlet("/aa.do")相当于配置了.xml文件中的UserAction 类的url为/aa.do
(1)添加库
buildpath-add library-JavaEE6 Libraries
(2)例题:
@WebServlet("/aa.do")//配置uri为/aa.do
public class UserAction extends HttpServlet{
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取uri
String uri=request.getRequestURI();
System.out.println("URI为"+uri);
//截取Uri,lastIndexOf包含头不包含尾,故要+1
String url=uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));
System.out.println("URL为"+url);
System.err.println("进来了没有");
}
}
运行servlet,浏览器输入:http://localhost:8080//jspDemo08/aa.do
打印结果:
(3)注:
(1)当配置uri为:@WebServlet("*.do")时,浏览器中输所有的.do(aa.do或者bb.do或者cc.do等)都会调用该类。
(2)当配置uri为:@WebServlet(urlPattern={"/aa.do","/bb.do","/cc.do"}),浏览器中输入aa.do或者bb.do或者cc.do都会调用该类。
(3)urlPattern也允许这样写:
当配置uri为:@WebServlet(urlPattern={"/user/aa.do","/user/bb.do","/user/cc.do"}),浏览器中输入http://localhost:8080//jspDemo08/user/aa.do或者http://localhost:8080//jspDemo08/user/bb.do或者http://localhost:8080//jspDemo08/user/cc.do都会调用该类。
(4)URL与URI
这是URI:jspDemo08/aa.do
这是URL:aa
(4)又一个例子
@ WebServlet(urlPatterns={"/user2/login.do","/user2/list.do","/user2/update.do","/user2/delete.do"})
public class User2Action extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取uri
String uri=req.getRequestURI();
//截取url
String url=uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));
if(url.equals("login")){
System.out.println("登陆成功 ");
}
else if (url.equals("list")) {
System.out.println("查询所有");
}
else if (url.equals("update")) {
System.out.println("删除成功");
resp.sendRedirect(req.getContextPath()+"/user2/list.do");
}
else if (url.equals("delete")) {
System.out.println("修改成功");//是在这里面调用dao中的方法
//修改成功,再重新查询
resp.sendRedirect(req.getContextPath()+"/user2/list.do");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
}
9,JSP EL
EL表达式
什么包都不需要导
<%=msg%>同等与${msg}
<% User user=request.getP("user");%>
${user.id} //等价于EL中的<%=user.getID()%>
1、文字
JSP 表达式语言定义可在表达式中使用的以下文字:
2、操作符
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
<%String msg=(String)request.getAttribute("msg"); %>
<font color="red"><%= msg==null ?"":msg %></font>
上面代码等同于:
<font color="red">${msg}</font>//我不懂为啥
10,JSTL表达式
1,使用前准备
(1)必须导入两个架包
(a)jstl.jar
(b) standard.jar
(2)在jsp头文件必需声明标签库,引入
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
2,常用的标签
(1)Set标签
通过jstl来塞值
<body>
<h1>set的使用</h1>
通过原来request来塞值:<% request.setAttribute("name01", "name值01"); %><br>
原来获取方法:<%=request.getAttribute("name01") %><br> EL表达式或取${name01 }
<br>
<!-- 通过jstl表达式来塞值<c:set var="变量 " value="值"></c:set> -->
通过jstl表达式来塞值:<c:set var="name02" value="name的值02"></c:set><br>
获取jstl中的值:${name02}<br>
<!-- 通过jstl表达式来塞值<c:set var="变量 ">值</c:set> -->
通过jstl表达式来塞值:<c:set var="name03" value="name的值03"></c:set><br>
获取jstl中的值:${name03}<br>
</body>
输出结果:
set的作用域
<body>
<h3>request作用域</h3>
<c:set var="name1" scope="request">set塞的值333</c:set><br>
通过page作用域来获取${pageScope.name1}<br>
通过request作用域来获取${requestScope.name1 }<br>
通过session作用域来获取${sessionScope.name1 }<br>
通过application作用域来获取${applicationScope.name1} <br>
不写通过作用域来获取${name1}
</body>
<body>
<h3>page作用域</h3>
<c:set var="name1" scope="page">set塞的值333</c:set><br>
通过page作用域来获取${pageScope.name1}<br>
通过request作用域来获取${requestScope.name1 }<br>
通过session作用域来获取${sessionScope.name1 }<br>
通过application作用域来获取${applicationScope.name1} <br>
不写通过作用域来获取${name1}
</body>
<body>
<h3>session作用域</h3>
<c:set var="name1" scope="session">set塞的值333</c:set><br>
通过page作用域来获取${pageScope.name1}<br>
通过request作用域来获取${requestScope.name1 }<br>
通过session作用域来获取${sessionScope.name1 }<br>
通过application作用域来获取${applicationScope.name1} <br>
不写通过作用域来获取${name1}
</body>
<body>
<h3>application作用域</h3>
<c:set var="name1" scope="application">set塞的值333</c:set><br>
通过page作用域来获取${pageScope.name1}<br>
通过request作用域来获取${requestScope.name1 }<br>
通过session作用域来获取${sessionScope.name1 }<br>
通过application作用域来获取${applicationScope.name1} <br>
不写通过作用域来获取${name1}
</body>
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
(2)remove
通过remove删除对应的作用域的值
<body>
<h3>remove标签的使用就是删除</h3>
<c:set var="name3" scope="application">set塞的值333</c:set>
塞的name3的值时${name3} <br>
<c:remove var="name3" />
删除后的name3的值${name3} <br>
</body>
通过remove删除不同作用域的值,删除失败
<body>
<h3>remove标签的使用就是删除</h3>
<c:set var="name3" scope="application">set塞的值333</c:set>
塞的name3的值时${name3} <br>
<c:remove var="name3" scope="request"/>
删除后的name3的值${name3} <br>
</body>
(3)URL标签
(4)import标签
(5)if标签
(6)choose标签
(7)forEach标签
<body>
<%
List<User> list=new ArrayList<User>();
list.add(new User(1,"张三1"));
list.add(new User(2,"张三2"));
list.add(new User(3,"张三3"));
list.add(new User(4,"张三4"));
list.add(new User(5,"张三5"));
list.add(new User(6,"张三6"));
request.setAttribute("list", list);
//以前的获取list方式
//List<User> user=request.getAttribute("list");
%>
<h3>C:forEach的使用</h3>
<table border="1" cellpadding="0" cellspacing="0" width="50%">
<tr>
<td>id</td>
<td>用户名</td>
</tr>
<c:forEach var="sbq" items="${list}">
<tr>
<td>${sbq.id}</td>
<td>${sbq.name}</td>
</tr>
</c:forEach>
</table>
<h3>第二种</h3>
<table border="1" cellpadding="0" cellspacing="0" width="50%">
<tr>
<td>id</td>
<td>用户名</td>
</tr>
<!--下标是从2开始,到第5条 -->
<c:forEach items="${list }" var="li" begin="2" end="5">
<tr>
<td>${li.id }</td>
<td>${li.name }</td>
</tr>
</c:forEach>
</table>
</body>
输出结果: