JSP介绍
JSP:1、JSP介绍:1》使用servlet技术时,要通过大量的out.println()语句输出页面,十分麻烦,不便于后期维护管理。jsp技术就是将servlet中的大量的输出语句抽取出来,2》JSP:Sun制定的一种服务器端动态页面技术的组件规范。------本质上是Servlet3》jsp是以“.jsp”为后缀的文件,由html和少量的java代码组成,jsp文件会被服务器(Tomcat)
·
JSP:
1、JSP介绍:
1》使用servlet技术时,要通过大量的out.println()语句输出页面,十分麻烦,不便于后期维护管理。
jsp技术就是将servlet中的大量的输出语句抽取出来,
2》JSP:Sun制定的一种服务器端动态页面技术的组件规范。------本质上是Servlet
3》jsp是以“.jsp”为后缀的文件,由html和少量的java代码组成,jsp文件会被服务器(Tomcat)转换成Servlet类后执行
2、JSP的编写规范:
1》如何编写jsp文件
a:写一个以“.jsp”为后缀名的文件
b:该文件中可以包含:HTML代码(html、css、JavaScript)、java代码、注释、指令、隐含对象
2》
1、HTML代码:html、css、JavaScript: 和在html文件中一样编写、控制浏览器的显示效果
转换成Servlet类中的service()方法的out.write()输出语句
2、 注释:<!-- --> 注释中包含java代码会被执行
<%-- --%>注释中的所有内容不会执行
3、Java代码:任意位置,控制页面可变内容的产生
java表达式:
<%= %>
内容:变量、变量加表达式、有返回值的方法
在Servlet类中用out.print()输出该表达式的值
java小脚本:
<% %>
内容:能写在方法中的java代码都可以
在Servlet类中,原封不动复制过去
java声明:
<%! %>
内容:成员变量或成员成员方法的声明
转译成Servlet类的成员变量或方法
3》指令:<%@指令名 属性=值 %> 控制页面转成Servlet类时的相关信息
page指令:
用于导包,设置页面属性
<%@page import="java.util.*,java.sql.*" %>-----导包
<%@page pageEncoding="utf-8" %>------设置jsp页面编码
<%@page contentType="text/html; charset=utf-8" %>----设置向浏览器发送数据的格式及编码
include:
在jsp转译成Servlet时可以将其他的文件包含进来,可以使jsp文件也可以是html文件
<%@include file=" " %>
<%@include file="demo.html" %>
taglib:导入标签库
<%@ taglib uri="uri" prefix="使用时的前缀" %>
4》隐含对象:
在jsp文件转译成Servlet实现类过程:
1.创建Servlet实现类
2.转译jsp文件
创建变量
write html
保留java脚本
print表达式
3.编译Servlet的实现类
在jsp代码执行之前创建了变量,变量就可以在jsp文件中直接使用,把这些变量就叫隐含对象或内置对象
使用这些对象可以简化对html和响应信息的处理
隐含对象 隐含类型 作用
*request HttpServletRequest 请求信息
response HttpServletResponse 响应信息
out JspWriter 输出的数据流
config ServletConfig Servlet的配置对象
application ServletContext 全局的上下文对象
exception Throwable 捕捉网页异常,必须在发生异常时才能使用
*session HttpSession 会话
page Object jsp页面本身
*pageContext PageContext jsp页面的上下文对象,通过该对象可以获取其他8个对象
使用示例
<%String s = request.getParameter("user");%>
<%=request.getParameter("user")%>
4、jsp运行原理: 首次访问转译,后不再转译
Tomcat会在接收到请求时查找jsp文件,然后将将jsp文件转译成Servlet的实现类,之后和servlet的运行原理一致
在jsp文件转译成Servlet实现类过程:
1.创建Servlet实现类
2.转译jsp文件
创建变量
write html
保留java脚本
print表达式
3.编译Servlet的实现类
1、MVC开发模式:经典的设计模式,代码的分层思想
M:Model,业务层,用来处理业务逻辑------------------------------------------Dao
V:View,视图层或显示层,用来显示展示数据-------------------------------------jsp
C:Controller,控制层,用来管理和调度程序,送业务层和视图层的桥梁------------------Servlet
其目的是降低代码的耦合度,达到高内聚低耦合,便于团队开发和后期维护
req.setAttribute("stu", s);向请求数据存入数据
req.getAttribute("stu"); 从请求数据取出数据
2、转发:依赖跳转
//转发给jsp,当前位置转发到目标上
/*当前:jsp2/findEmp
*目标: jsp2/emp_list.jsp
*相对路径:emp_list.jsp
*/
req.setAttribute("name",date);//绑定数据
req.getRequestDispatcher("emp_list.jsp").forward(req, res);//转发
req.getAttribute(name);//获取绑定数据
3、转发与重定向:***
转发特点:
1、一次请求
2、地址不变
3、公用一个request,所以可以通过request共享数据
4、不能转发到外部,只能在项目内部转发
重定向特点:
1、两次请求
2、地址改变
3、两个request,不能通过request共享数据
4、可以重定向到外部资源
通常:查询时用到转发,增加、删除、修改用到重定向
4、EL和JSTL:降低jsp文件的复杂度,使jsp便于维护
1》EL:${ }
获取,处理数据显示数据
1、获取bean属性:是方法名去掉get,得到方法名的小写全称
user---等价于--getUser
name---等价于--getName
<p>姓名:${stu.name}</p>---------java中等价于 request.getAttribute("stu").getAttibute("name");
<p>年龄:${stu["age"]}</p>
<p>课程id:${ stu.course.id}</p>---request.getAttribute("stu").getCourse().getId();
EL 默认从以下4个对象(范围)中依次取值
page、request、session、application
即:
->page.getAttribute("stu")
->request.getAttribute("stu")
->session.getAttribute("stu")
->application.getAttribute("stu")
取值范围也可以指定
[page/request/session/application]Scope.stu.name
${requestScope.stu.course.name}
获取项目路径
${pageContext.request.contextPath}
java中等价于----pageContext.getRequest().getContextPath()
2、支持运算:
<p>年龄+10:${stu.age+10}</p>
<p>年龄是否大于20:${stu.age>20}</p>
<p>是否介于20到30之间:${stu.age<30 && stu.age>20}
<p>是否为空:${empty stu }</p>
<p>是否为空:${stu==null }</p>
${cost.costType==1?"checked":""}
3、获取请求参数
param.x =======request.getParameter("x")
paramValues.y====request.getParameterValues("y")
-->
<p>读取请求参数:${param.x}</p>
2》JSTL:
jsp标准标签库,javaEE5.0的核心,要导包jstl的jar包
<%@ taglib uri="uri" prefix="使用时的前缀" %>引入标签
1》 if标签
语法:<c:if test="判断条件">值</c:if>判断条件为true执行内容,判断条件可为EL
<c:if test="${stu.sex=='M'}">男</c:if>
<c:if test="${stu.sex=='F'}">女</c:if>
2》choose标签,选择if(){}else if(){}else{}
<c:choose>
<c:when test="${stu.sex=='M'}">男</c:when>
<c:when test="${stu.sex=='F' }">女</c:when>
<c:otherwise>性别不祥</c:otherwise>
</c:choose>
3》forEach,遍历数组或集合
等价于:for(Object itr :interests){......}
varStatus:每次循环JSTL会创建一个对象,用来存循环次数等值,通过varStatus属性声明该对象的变量
从而来访问该对象,获取循环次数等值
语法:
<c:forEach items="数组或集合" var="接收的变量名" varStatus="存储循环信息的对象">
${itr},${s.index下标},${s.count次数}</br>
</c:forEach>
例:
<c:forEach items="${stu.interests}" var="itr" varStatus="s">
${itr},${s.index},${s.count}</br>
</c:forEach>
JSTL的运行原理:图......
4》自定义标签:
1、编写标签java类(...Tag),继承SimpleTagSupport
2、重写doTage()方法,添加处理逻辑
可以通过构造器、setxxx、传参
3、在WEB-INF中配置标签说明文件参考c.tld标签文件。.tld
5、异常配置:
在web.xml文件中配置,两种方法,选择其一配置异常,发生异常时跳转到指定的某一页面,--------声明式处理异常
应用场景:
对于程序异常-----编程式处理方法----空指针异常
对于系统异常-----声明式处理方法----数据库连接不上
<!--配置异常(选择其一配置,有异常时,跳转到某个页面) -->
<!--1、按照异常类型配置 -->
<error-page>
<exception-type>java.lang.Exception</exception-type><!-- 异常类型 -->
<location>/WEB-INF/error.jsp</location><!-- 此处写jsp路径时应写绝对路径并且会自动补充项目名故不能写项目名称 -->
</error-page>
<!--2、按照异常标号配置 -->
<error-page>
<error-code>404</error-code><!-- 错误编号 -->
<location>/WEB-INF/error.jsp</location>
</error-page>
6、路径:
绝对路径:以固定位置跟路径寻找目标文件,以 / 开头
相对路径:从当前文件寻找抵达目标文件,不以 / 开头
7、coolie和Session
1、HTTP是无状态协议,一次请求一次连接即断开,服务器不记住浏览器。状态:浏览器访问过的数据(任意)
实际业务中,有时需要服务器记住浏览器,如:登陆时记住账号,到其他页面显示账号
记住浏览器要求:
跨浏览器:每个浏览器记录一份数据,不能用Context
跨请求:多次请求共用一分数据,不能用request
cookie和Session可以跨浏览器跨请求记住浏览器
2、Cookie:将数据存储在浏览器上,容易被篡改,服务器节约内存
Session:将数据存储在服务器上,安全不会被篡改,服务器压力大
3、使用场景:
重要数据存Session中,不重要数据存Cookie
4、状态管理:
使用Cookie和Session记录数据,目的是让服务器记住浏览器访问过的状态,称为状态管理
5、cookie使用:
*只支持ASCII码编码字符,不能直接传汉字,传汉字要进行编码
在Servlet中
//创建Cookie,每个Cookie内只能存 一个String类型的数据
Cookie c1 = new Cookie("user", "zhangsan");
/*
* 设置Cookie的过期时间,此cookie将被浏览器存到硬盘上,超出时间自动删除,必须写在发送之前
* 不写关闭浏览器,Cookie就自动销毁
*/
c1.setMaxAge(60000);//时间以秒为单位
//将cookie发送给浏览器
res.addCookie(c1);
===============================================
//浏览器再次访问服务器时,会自动将之前的cookie传入给request
Cookie[] cs = req.getCookies();//获取的是cookie数组,浏览器的一堆数据
if(cs != null){
for (Cookie c : cs) {
System.out.println(c.getName()+","+c.getValue());
}
}
================================================
jsp中获取
<!--使用EL可以直接获取Cookie
语法:cookie.key.value
-->
<p>用户:${cookie.user.value}</p>
================================================
修改cookie:
//修改cookie
c.setValue("lisi");
//发送给浏览器
res.addCookie(c);
================================================================
//Cookie中默认不能传中文,,必须对中文编码后才能保存,包是 .net中URLEncoder、URLDecoder
Cookie c2 =new Cookie("city", URLEncoder.encode("北京", "utf-8"));
----------------------------------------------------
//浏览器再次访问服务器时,会自动将之前的cookie传入给request
Cookie[] cs = req.getCookies();//获取的是cookie数组,浏览器的一堆数据
if(cs != null){
for (Cookie c : cs) {
System.out.println(c.getName()+","+URLDecoder.decode(c.getValue(), "utf-8"));
}
}
在jsp中依然是ASCII码,
<p>城市:${cookie.city.value}</p>乱码
========================================================
默认情况同一级目录及其子目录下创建的Cookie对象,是公用的,其他不共用即无效
可以设置有效路径
//创建Cookie
Cookie c3 = new Cookie("company", "tarena");
//设置Cookie的生效路径,Cookie将在此路径及下级路径有效
c3.setPath(req.getContextPath());//设置为项目路径,全项目有效
//传给浏览器
res.addCookie(c3);
Cookie可以被用户禁止
关闭浏览器cookie释放
6、Session的使用:
浏览器首次访问服务器时,Tomcat自动创建Session对象,之后同一浏览器再次访问服务器不再创建,30minTomcat自动关闭
Session的使用依赖与Cookie,默认有效期:30min
Session可以存任意类型的数据
============================
//获取Session
HttpSession session = req.getSession();
//向Session中存入数据,可以使任意类型数据
session.setAttribute("user", "张三");
//响应时服务器自动将Session的id(SESSIONID)发送给浏览器,浏览器自动将其存入Cookie
============================
//取出session中的相关数据
Object obj = session.getAttribute("user");
System.out.println(obj);
===========================
立即销毁Session
session.invalidate();
Session默认有效期:30min,可以修改
1、配置文件web。xml
<session-config>
<session-timeout>1</session-timeout>
</session-config>
2、编程式修改:
cookie禁用,session不能用,可以使用url重写发送sessionId
验证码:参考案例mybetctoss
8、过滤器(Filter):
1、对请求和响应数据进行某种操作,进行过滤,
服务器在接收到请求后,Tomcat会在调用Servlet类之前调用过滤器Filter前代码,
在响应时调用过滤器Filter的后代吗
2、写过滤器的步骤
1》写java类,继承Filter接口
2》实现Filter接口的三个方法,过滤逻辑在doFilter方法中实现
3》在Web.xml程序中注册过滤器
4》把过滤器和Web应用一起打包部署
3》过滤器Filter的优先级
多个filter之间的调用顺序以mapping顺序为准
4》预置参数:给此filter预置数居,
<init-param>
<param-name>city</param-name>
<param-value>北京</param-value>
</init-param>
在服务器启动时FilterConfig会自动读取数据并由服务器自动将FilterConfig
对象传入该过滤器Filter的init()方法
==========================
<filter>
<filter-name>second</filter-name>
<filter-class>web.SecondFilter</filter-class>
<!--给此filter预置数居,在服务器启动时FilterConfig会自动读取数据并由服务器自动将FilterConfig
对象传入该过滤器Filter的init()方法 -->
<init-param>
<param-name>city</param-name>
<param-value>北京</param-value>
</init-param>
</filter>
<!-- 多个filter之间的调用顺序以mapping顺序为准 -->
<filter-mapping>
<filter-name>second</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
===========================================
9、监听器:
1、 监听器的作用用来监听某些事件
1、对象的创建和销毁事件(生命周期相关事件)
2、添加、修改、删除数据的事件(绑定数据相关事件)
只有request、session、ServletContext有相关的监听器
2、编写监听器:
1、写java类,实现相应的监听器接口
2、在监听器接口中实现相应的方法
3、配置监听器
3、<!--配置监听器
1、服务器启动时会自动实例化此监听器
2、在监听器目标发生对应事件时(创建、销毁)服务器会自动调用该监听器的相关方法
-->
<listener>
<listener-class>web.MyListener</listener-class>
</listener>
更多推荐
已为社区贡献1条内容
所有评论(0)