您的位置:首页 > Web前端 > JavaScript

JSP的基础知识

2018-03-14 17:40 232 查看
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<body>标签内就可以在网页中看到这个变量。

<% %>标签可以拆分多段来使用例如:
<%
for(int i=0;i<10;i++){
%>
<%=i%>
<%
}
%>

JSP中的注释:

第一种注释:<!-- 这里就是需要注释的内容html标签等 -->注释后查看源文件还存在。

第二种注释:<%-- 这里就是需要注释的内容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页面

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

以上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网页。那么我们只需要把那些公共的内容保留,其他<body> <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-config>
<session-timeout>20</session-timeout> 单位分钟
</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();
然后来使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JSP Blog