浅入浅出JSP
1.什么是JSP
java Server Pages :java服务端页面,和Servlet一样,用于动态Web技术!
最大特点:
- 写JSP就像再写HTML
- 区别:HTML只给用户提供静态的数据,JSP页面中可以嵌入java代码,为用户提供动态数据;
1.JSP原理
思路:JSP到底是怎么执行的。
浏览器向服务器发送请求,不管访问什么资源,其实都在访问Servlet
JSP最终也会被转换成一个Java类。
这边我们可以通过,我们运行我们的Tomcat服务器的时候找到生成java类的一个路径。
复制路径到文件中
我们通过查看这个自动生成的java类中的源码可以知道,JSP本质上就是一个Servlet因为它本质上继承了一个Servlet的一个包
1.里面的一些方法
//初始化
public void _jspInit(){
}
//销毁
public void _jspDestroy(){
}
//JSPService
public void _jspService(.HttpServletRequest request.HttpServletResponse response)//里面有着HttpServlet中的request跟response对象
2.一些内置的对象(皆是源码中的对象)
final javax.servlet.jsp.PageContext pageContext;//页面的上下文Context
javax.servlet.http.HttpSession session = null;//Session
final javax.servlet.ServletContext application;//application Context
final javax.servlet.ServletConfig config;//config
javax.servlet.jsp.JspWriter out = null;//out
final java.lang.Object page = this;// 代表当前 page
HttpServletRequest request//请求
HttpServletResponse response//响应
3.页面输出前的代码
以上的对象我们在JSP中都会使用到(注意上面的都是生成的java类中源码的文件)
4.用户访问JSP文件流程图
运行JSP文件 将jsp文件转换成java文件然后编译成java,class。然后返回给web容器,用户拿到的就是一个class对象.
在JSP页面中:
只要是JAVA代码就会原封不动的输出;
如果是HTML代码,就会被转换为:
out.write("<html>/r/n")
这样的格式,输出到前端。
2.JSP基础语法
上面说的是一些JSP跟web交互的一些原理,源码以及逻辑,下面我们来说一下JSP的基础语法,任何语言都有自己的语法,Java中有,jsp作为java技术的一种应用,它拥有一些自己扩充的语法,虽然主键JSP以及被淘汰但是一些东西我们还是需要懂,jsp支持所有java语法。格式就是:<%内容%>
1.JSp的基础语法
<% JSP表达式 作用用来将程序的输出,输出到客户端%>
<% = 变量或者表达式%>--%>
<%=new java.util.Date()%>
2.JSP的一些小脚本(跟java差别不大)
<%
int sum=0;
for (int i = 0; i <=100; i++) {
sum+=i;
}
out.write("<hr> <br>");
out.write("sum:"+sum);
%>
3.JSP中的声明
<%!
static {
System.out.println("进入了作用域");
}
private int GlobalVar = 0;
public void Xs() {
System.out.println("进入了方法Xs");
}
%>
重点:如果我们这边声明的话,我们是可以在源码中找到的.
实际上JSP就是可以嵌入Java代码
<%%>//最基础语法
<%=%>//可以获取赋值之后的内容
<%!%>//声明
<%------%>//注释 注意如果是html的注释写在JSP中是不起作用的
3.九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application 【ServletContxt】 存东西
- config
- out
- page
- exception
1.这九个对象中就是4个存东西的对象最常用简单介绍这个存东西对象的区别 这边我们直接用图展示更加方便观看。
运行之后的页面:
2.由图一可知它们之间的作用域是不一样的。接下来会详细的说说每个作用域的区别。
pageContext.setAttribute("name1", "xx一号");//保存的数据只在一个页面中有效
request.setAttribute("name2", "xx二号");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3", "xx三号");//保存的数据只在一次会话中有效,从打开到关闭浏览器
application.setAttribute("name4", "xx四号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
3.这时我们创建一个新的jsp文件用于查看另一个页面看来看看页面的作用域差别。
我们这是再访问这个页面之后的页面显示:
这个页面我们可以简易的理解为:PageContext跟request这俩个的作用域只在当前页面有效。
4.我们当前用的时谷歌浏览器访问的,如果我们再换个浏览器访问,用火狐浏览器访问会发生什么?
这里发现只取出了四号。
所以在这里可以总结出来,Pagecontext跟Resquest的作用域只基于当前页面,换个页面就不行了,Session只是基于本浏览器,换个浏览器就没法展示,application的作用域是最高的基于所有的浏览器之上的,无论换任何浏览器都可以展示。
5.几个对象的使用场景
request:客户端向服务发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
Session:客户端向服务器发送请求,产生的数据,用户看完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户看完了,其他用户还可以使用,比如:聊天室。
4.JSP标签,JST标签,EL表达式
(1).目前JSP标签跟el表达式也不是目前重要的知识了大家只要懂就行了。
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<jsp:forward page="jsp9daduix.jsp">
<jsp:param name="name" value="sunhengzhi"/>
</jsp:forward>//forw一个转发的功能 这行代码的意思是再转发的过程中创建了一个键值对
JSTL表达式
相对于前俩个标签这个标签相对重要,JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样!
核心标签
JSTL标签库使用步骤
- 引入对应的Taglib
- 使用其中的方法
- 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
1.c:if:
<body>
<h1>if判断</h1>
<form action="JstlBQlx.jsp" method="get">//这边设置的跳转页面是本页面
<input type="text" name="username" value="${param.username}">//获取我们text中输入的值 这边用的是el表达式
<input type="submit" value="提交">
</form>
<c:if test="${param.username=='admin'}" var="IsAdmin">//这边用的是一个C:if标签判断值是不是admin 运用了el表达式,这边var里面设置的bollean类型,true就返回ISAdmin
<c:out value="欢迎管理员访问我们的页面" />
</c:if>
<c:out value="${IsAdmin}" />//一个输出的标签<C:OUT>
</body>
- c:choosec(choose是swich的父类) c:when (基于父类下的switch循环)
<c:set var="cj" value="90"></c:set>//运用了一个set标签赋值
<c:choose>
<c:when test="${cj>=90}">//运用el表达式判断cj是不是大于90
成绩优秀
</c:when>
<c:when test="${cj<90}">
成绩差劲
</c:when>
</c:choose>
3.c:foreach
<%//运用jsp基础语法把值存在list中
ArrayList pop =new ArrayList();
pop.add("张三");
pop.add("李四");
pop.add("王五");
pop.add("赵六");
pop.add("田七");
request.setAttribute("list",pop);//这边是把值获取出来,并且给了一个键
%>
<a:forEach var="pup" items="${list}">//获取了值 然后遍历出来
<c:out value="${pup}"></c:out>//这边输出遍历的值
</a:forEach>