JSP的基础知识
servlet 用来动态生成html网页非常麻烦。输出全部需要调用out.println();方法 所以我们使用jsp来动态生成html 并且以后我们的时间工作中也是这样做的。
JSP 全名:java server page java服务端页面 就是为了简化servlet的工作而出现的。。
JSP包含很多技术,比如java脚本。EL表达式,JSTL标签,还可以自定义标签等。这些技术就使得JSP在视图层有很大的优势。
在jsp的开头有一个page指令如下:里面包含了一些属性。
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
language表示开发语言是java inport导入util包,可以导入多个用逗号分开,pageEncoding表示字符编码
在jsp中嵌入的java代码全部是放在百分号里面
JSP脚本:<% 这里写java代码 %> 写在<% %>内的代码都叫 JSP脚本。可以放在jsp的任何地方。
动态网页:根据用户不同的请求来把数据捞出来,给它不同的效果。
在 servlet 中输入变量使用:out.println();方法 那么我们在jsp中输入变量应该怎么办?
那么就需要另外一个标签<%= 这里输入变量名 %> 这种语法同样可以放在jsp内的任何地方。例如:<%= j %> 注意j这个变量必须是前面jsp脚本内定义的变量。定义在html标签内就可以在网页中看到这个变量。
<% %>标签可以拆分多段来使用例如: <% for(int i=0;i<10;i++){ %> <%=i%> <% } %>
JSP中的注释:
第一种注释: 注释后查看源文件还存在。
第二种注释:<%-- 这里就是需要注释的内容html标签等 --%> 注释后查看源文件也被隐藏。
JSP中怎样定义java方法:
同样需要标签<%! %>来定义方法 方法一般在JSP中顶端定义
方法定义后我们就可以在jsp脚本内使用<% 调用方法 %>
<%=sayhello()+"值:"+x%> 使用+号输出多个变量
深入了解jsp技术
jsp指令的作用有:编码。文档类型,导入java包等。。。
用法为:以符号<%@开始,以符号%>结束
看这个写好的指令:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> pageEncoding表示本页面的编码设置为utf-8
可以单独使用page指令导入包使用: <%@ page import="java.util.*" >
web工程下面的Webroot下面可以创建一些Folder文件夹 专门放jsp或者其他什么页面
java中是新建package 在web工程中是新建Folder 同样效果都是包的意思
jsp九大内置的对象 面试会问要背下来
request
response
session (发音:舌醒) application (发音:a扑里K醒) out config
page pagecontext exception (一颗色扑醒) 例外 跳转方式 :
redirect 请求重定向 会截断先前的请求,开始新的请求。 response.sendRedirect("index.jsp");
forward:请求转发 前后共享请求资源 request.getRequestDispatcher("index3.jsp").forward(request,response);
Web作用域(scope)根据用户的请求的状况来识别
四个作用域:
page域:最小的作用域,一个page就是一个jsp页面。这个作用域内数据只可以在当前页面使用(单页面)
请求域 request:请求域是一个更加广的作用域,某一个页面跳转到另外一个页面,或者是提交表单到另外一个页面总之是会到另外一个页面的。也就是说:某一个页面在请求另外一个页面他们所构成的这个范围叫请求的域。(多页面最少2个)
会话作用域 session:会话代表一直联系关系,可以是持久的关系。比request域更加广。
应用程序作用域 (application) 是一个全局作用域数据可以在整个web程序内都有效。
(发音:一颗扑rua醒)表达 expression language EL表达式:主要是帮助我们在jsp页面取值的。
EL表达式是以${开始,以}结束 完全可以代替<%=%>
EL表达式可以从page request session application 的作用域里面取值。例如我在,某个作用域里面放了值,在另外的作用域里面得到就需要使用EL表达式。
取值的用法:你的作用域 . 点出变量名
例如:pageScope 用法:${pageScope.xxx}
EL表达式还支持简单运算。加减乘除,取模等
例如:${15+12} 里面的数据可以换成作用域中的变量属性
EL表达式还支持比较运算,计算后的结果是布尔值。还可以使用逻辑运算符
MVC模式:三层架构
M:模型层(model) 如pojo service等 V:视图层(view) 如html jsp等 C:控制层(controller) servlet struts action
Servlet 专门处理java代码业务逻辑 JSP专门处理网页 Servlet并不是完全被jsp取代,而是作为控制层专门处理请求响应,发挥最大的作用 配句 因酷的 包括包含 jsp除了page指令外还有其他的指令:include,taglib等
include指令主要是使当前页面包含本应用程序内的另外一个jsp或者html页面
以上xml文件中这段代码意思为:加载默认页面。意思就是有多个jsp页面,您默认是打开那个页面。就是那个页面是首页的意思
设置jsp的默认打开为MyEclipse JSP Editor windows -> General -> Editor - > File Associations 选择 *.jsp 点击 MyEclipse JSP Editor 然后选择default
把jsp中公共的内容独立出来?
专门做一个jsp里面放公共的内容。那么我们如何在其他的jsp页面中去引用这个jsp中的公共的内容呢?
<%@include file="/head.jsp"%> 使用include 指令实现这个功能
其实这个指令会在jsp网页中在嵌入一张jsp的网页。那么我们在查看源代码的时候就会发现,源码中居然有几个html网页。那么我们只需要把那些公共的内容保留,其他 等都可以删除
什么是jsp的内置对象?直接可以在jsp中点出来的对象。不需要创建就可以直接点对象使用
out内置对象的使用 在jsp中有些多此一举
page:表示当前jsp的对象 tomcat new对象。jsp只是一个模版
pageContext:代表当前jsp编译后的内容 作用域的对象 a特标特 属性 这个对象最常用的方法有:setAttribute() 和getAttribute() 取值不可以在其他页面取值。作用域只在当前页面 类似键值对
request:请求对象。代表客户的请求会封装客户的一些请求信息 和servlet内的httpservletrequest对象一样
<%request.setAttribute("my","何小林");%> 设置变量 有点类似键值对结构
<%=request.getAttribute("my") %> 得到变量
response:响应对象。可以给用户响应一些信息,和servlet中的HttpServletResponse对象一样
两种跳转方式:redirect和forward 瑞滴rua课特 redirect
response.sendRedirect(path+"/Test/jsp1.jsp"); 从当前页面自动跳转到指定页面。
可以随时使用线程中的睡眠 Thread.sleep(5000); 睡眠5秒在跳转。需要Thread线程类名点出方法sleep
redirect这种请求会在浏览器的地址栏改变成目标的url 就相当于一个超链接。并且还会截断先前的请求进行新的请求。所以,我们使用redirect跳转的时候,在当前页面<%request.setAttribute("my","何小林");%>设置的一个值,在目标页面是没办法得到的。因为这2个请求不是同一个作用域
使用 forward跳转方式可以实现始终一个请求不会创建新的请求。 <% request.setAttribute("1","张理斌"); request.getRequestDispatcher("/Test/jsp1.jsp").forward(request,response); %>
这里不需要path 因为默认是当前工程路径。forward()内传入当前的内战对象request和response
和redirect跳转第一个不同:地址栏不变 但是确实跳转过去,表示同一个作用域
第二个不同:response.sendRedirect("http://www.baidu.com/"); 可以跳转到外网页面 forward就不行,只能跳转到自己工程的页面
为什么这2总跳转方式一个得不到值一个能得到值呢?看这个例子:
public static void main(String[] args) { Student stu=new Student(); stu.setName("张理斌"); redirect(); System.out.println(stu.getName()); } public static void redirect(){ Student stu=new Student(); stu.setName("何小林"); } 打印出来的是:张理斌 因为redirect()方法虽然也创建了对象但是创建的另外一个对象。和main方法中的对象不是同一个对象。可是我们打印的确实main方法中的对象。自然打印的是张理斌。我们把方法换一下。
会话作用域 session 可以跨越多个请求
session.setAttribute("stu","张理斌");
在某一个页面使用session对象创建一个值。然后我们在默认页面通过session.getAttribute("stu") 取值。然后启动tomcat访问默认页面发现session的值为:null 这是因为我们还没有访问设置session值的那个页面现在我们在访问下那个页面,接着在打开默认页面。session的值终于取到了。呵呵!
session的超时时间可以通过web.xml中的session-config元素来设定:
session的注销:让设置的值清空或者说失效?
session.removeAttribute("stu"); 设置一个你设置的参数名 一般在另外一个页面设置清空。当我们需要清空session设置的值的时候就可以访问另外设置了清空的页面。访问后,在打开默认页面。发现值现在为null。
不过这种方式只能清空一个数据,那么有没有一种方法可以让所有的数据都清空呢?当然有。 因va理date 失效 使用session.invalidate(): 方法可以让所有设置的数据失效 在你登录一个网站然后需要退出的时候就是使用这个方法来做的。
有2中方式可以让session设置的值失效。第一在xml文件中配置session失效时间 第二:使用方法让设置的值失效
EL表达式
它提供了一种取值的方式。很方便。很多时候EL表达式可以替代jsp脚本
取值方式: 美元符合 ${ 这里写变量名 } 比jsp脚本节省非常多的代码很简洁方便
请求域中使用EL表达取对象的值。我们知道如果使用jsp脚本取值是这样:
<% Student stu1=(Student)request.getAttribute("stu"); %> <%=stu1.getName() %> <%=stu1.getAge() %>
因为是Object可以存任何类型的值所以取值的时候必须先强制转换。在通过对象名点出属性。取值。这样非常麻烦。
那么我们使用EL表达式这么取值呢?
${ stu1.name } 直接这样取值就ok name是Student类的属性名 因为这里的语法是jsp中独有的。和java是不一样的。
如果有多个值切忌不可以这样取值${ stu1.name+stu1.age } 这样会报错
EL表达式会自动识别你类中的标准的get set 方法。并且调用。所以我们可以这样方便的来取值
报500错误表示你的程序出现错误。404表示地址错误找不到页面
请求域是forward跳转产生的。
使用EL表达式取请求域中的值还不需要导入包 可见EL表达式的强大
虽然EL表达式非常强大简洁方便。但是也有些缺陷,比如我们需要在不同的作用域取值。必定会遇到相同的对象名。如果我们不使用一些措施,EL表达式在取值的时候是会默认从小到大的作用域中寻找。这样取值的时候会遇到其他作用域中的值取不到的情况。
我们如何解决这个事情呢? 思够扑 范围 ${ requestScope.stu.name } 取值的时候我们如果是取请求作用域的值就需要加上作用域名request 在加上 Scope这个单词 如果是page作用域同样也需要加上Scope这个单词。。这样就可以方便的在指定作用域中取到我们想要的值 了。
这样的EL表达式取值方式才是标准的方式。大家记得使用
总结: ${ pageScope.stu.name } =pageContext.getAttribute("***"); ${ requestScope.stu.name } =request.getAttribute("***"); ${ sessionScope.stu.name } =session.getAttribute("***"); ${ applicationScope.stu.name } =application.getAttribute("***");
EL表达式的运算
${56+45+89*2} 可以直接这样来做运算
${ 5<10} 返回一个布尔值 true或者false
在EL表达式中判断数据类型的值,或者判断字符串是否相等都可以使用==号来判断。注意这里和java语法不一样。
注意EL表达式中的字符串使用单引号括起来 ' 张理斌 '
通过EL表达式来接收参数
传统的得到参数是使用 request.getParameter("id") a标签传参 ?id=具体值
那么我们如何使用EL表达式来得到用户的参数呢?
使用EL表达式中的内置对象param ${ param.id} 这样就可以 了 这样的方式很少用知道就行了
使用EL表达式最大的用处就是在作用域里面取值不怎么做别的事情
传入一个参数可以使用加?号的方式 所有的链接后面都可以加这样的一个参数 然后就可以request.getParameter("参数id")得到参数值
response.sendRedirect(path+"/success.jsp?id="+username);
实际工作中我们是使用:request.getRequestDispatcher("/success.jsp").forward(request, response); forward跳转
if("admin".equals(username)){ } 这种判断方式可以防止空指针异常 更加好
if(username.equals("admin")){ }
servlet中没有session对象 我们可以创建一个 HttpSession session=request.getSession(); 然后来使用