JSP基础和语法

JSP(java server pages)

早期发展:

早期项目没有分层的概念,全部都是用jsp来完成,没有可维护性;

随着控制层从Model1体系中独立出来,jsp渐渐只作为视图组件,而现在很多新技术已经开始淘汰jsp;

概念:

服务端基于java语言的网页技术

语法特点:

把java程序以<%%>的形式,嵌入到html的页面中;

JSP的执行特点

1.必须由用户发送请求才可执行

2.在浏览器的地址栏输入127.0.0.1:8080\helloweb\hello.jsp,发送HTTP请求;

3.通过IP地址找到服务器,通过8080端口找到Tomcat,在默认路径webapps中找到和项目名对应的目录\helloweb,然后在文件根下找到hello.jsp

4.tomcat只执行动态代码,不执行静态代码,并把动态代码的执行结果嵌入到静态代码中发送给浏览器,浏览器对文件进行解析再显示在浏览器上;jsp又叫动态页面,因为tomcat会打开jsp页面执行动态代码;( jsp就是由静态代码+动态代码组成的,动态代码由服务器执行,静态代码浏览器执行;) 

5.动态组件(jsp、server、filter等tomcat执行的文件)和静态页面(xml),都是存放在服务端的web项目里;

6.动态组件,tomcat会打开执行;静态页面,tomcat不打开通过信道直接发送给浏览器处理;

tomcat执行jsp的流程

1.启动tomcat;

2.浏览器发送请求:127.0.0.1:8080\helloweb\hello.jsp;

3.服务端通过8080端口找到tomcat,通过项目名到webapps下找到helloweb目录,并在目录根下找到hello.jsp(或根据虚目录寻找);

4.tomcat把hello.jsp转换成hello_jsp.java,在调用JDK的javac把java文件编译成hello_jsp.class,再调用JDK的java执行这个字节码文件中的动态代码;

5.把JDK调用java的执行结果嵌入到hello.jsp当中,通过HTTP协议发回给浏览器,由浏览器显示,信道关闭;

特殊情况:如果jsp代码在执行一次后修改了里面的代码,第二次发送请求时,浏览器可能显示的还是原来的内容,因为tomcat看到执行过的代码,会直接找到该文件的class文件,然后直接执行这个文件,此时需要删除work文件夹,并重启tomcat才会有效;

java与jsp的对比

java特点(简单举例):

1.面向对象,一次编写到处运行;

2.跨平台(线程和AWT不跨平台);

jsp特点:
1.重新定向:如,jsp登陆成功转到成功页面,登陆失败转到失败页面;

2.传输数据:如,业务层拿到结果数据放到内置对象里,jsp从内置对象拿到结果信息进行渲染;

3.动静分离:内容的生成和显示是分离的(由于动态代码和静态代码执行的工具不同),便于维护;

4.使用可重用组件;

5.使用标签,简化了开发;

6.具有Java所有优点;

7.容易整合到多种应用体系结构中;

客户端发送请求的方式
地址栏——get请求;

超链接——get请求;

表单——post请求,更安全,数据放在HTTP协议体里;

jsp的注释

静态注释:

1.静态代码的注释,静态注释会被发送到浏览器,由浏览器处理,客户端可通过查看页面的源代码发现这些显示注释;

2.基本形式:<!--注释-->;

3.该形式也可以用作配置文件的注释,只是给tomcat或框架一种指导思想,不会执行;

动态注释:

1.动态代码的注释,由服务器(JDK)处理,不会被发送给浏览器显示;

2.动态代码:原生java代码,标签,表达式、指令;

3.也可以直接使用原生的java注释(单行注释和多行注释),还是由服务器处理,不会发送给浏览器显示;

4.基本形式:<%--注释--%>;

注释的优点:便于维护,可读,便于调试,便于开发

jsp变量

全局变量:

1.java中是类里定义的变量,会有默认的初值

2.jsp执行时只初始化一次,上一次的执行结果会作为下一次执行的初值;

3.语法:<%!全局变量%>;

局部变量:

1.java中是方法里定义的变量,必须显示的初始化,否则就是垃圾值;

2.jsp每次执行时都会为局部变量重新初始化;

3.语法:<% 局部变量%>;

注:1、同一个方法的局部变量可以在不同的线程的不同栈帧里开辟空间;2、不要在jsp中创建对象,会难以维护,jsp只用来做渲染,不要越界做其他事,但可以通过标签拿到对象,并使用对象的方法;

jsp表达式

作用:向浏览器输出结果信息;

语法:<%= 输出值%>;

java输出语句与jsp表达式的区别:

共同点:向浏览器输出结果信息;

不同点:

1.语法范畴不同,out.println属于java语法范围,表达式属于jsp语法范畴;

2.写法不同,out:<%out.println(i*j);%>,表达式:<%=i*j%>;

3.输出使用的对象不同,out用out内置对象(不符合mvc设计思想,边界明确,指责单一),表达式用response内置对象(更好);

结论:表达式输出更简单,因此推荐使用表达式输出;

jsp的常用指令

1.page指令

<%@ page contentType="text/html;charset=gb2312"%>

作用:主要用来指明当前jsp页面的属性;

(1)静态编码

对当前页面当中contenType所指的类型的代码里(text/html)的静态汉字用gb2312编码;为jsp的页面指定编码:只能设置一次;原则写在页面的第一行,且只对当前页面的汉字有效;由服务器执行;

(2)导包

<%@ page import="java.util.Date"%>

(3)指明出错页;

(4)使用编程语言;

(5)session管理;

(6)缓冲设置处理;

(7)设定页面MIME类型;

2.include指令

不管被包含页面的内容,只是把指定页面的内容包含到当前页面,然后执行(先包含,后执行

语法:<%@include file = "被包含页面"%>

问题:被包含页面不能出现和当前页面相同的变量名,因为变量不能重复定义,否则会出现编译错误;被包含页面不能出现html标签;

指令包含和标签包含的异同

1.语法范畴不同;指令--jsp,标签--java

2.写法不同;指令<%@include file = "被包含页面"%>,标签<jsp:include page="被包含页面"/>

3.指令包含不管类型;标签识别被包含页面的类型

4.指令不可以传参,标签--动态页面--可以传参

5.实质:指令--先包含,后执行,标签:动态页面--先执行,后包含;静态页面--先包含,不执行;

6.缺陷:指令--被包含页面不能有html标签,如果被包含页面和当前页面有相同定义的变量,会出现编译错误;

标签---不能有html标签,不要有静态页面,容易出错;

结论:尽量用动态页面--用标签包含;

 

标签跳转

标签只能用在jsp页面里,对结果信息进行处理(渲染);

<h1><%=request.getParameter("ref1")%></h1>
<h1><%=request.getParameter("ref2")%></h1>
<jsp:forward page="forwardDemo02.jsp"/>

服务端跳转:

只在前台发送一次请求,只有一个request内置对象,可以在后台的各个组件之间互相传递;

在客户端只能看到一个请求,相对安全;

附加知识点

表单

使用表单的目的:方便和用户交互;自动生成HTTP协议;安全;

示例:

<html>
<head>
	<title>JSP</title>
</head>
<body>
<!-- HTML与服务器交互的主要途径是表单 -->
输入表格的行数与列数,进行表格打印操作
<form action="printTable03.jsp" method="get" >
	行数:<input type="text" name="rownum"><br>
	列数:<input type="text" name="colnum"><br>
	<input type="submit" value="打印">
</form>
</body>
</html>

请求发送方式:

1.get请求(地址栏、超链接、表单设置get请求)

例:http://127.0.0.1:8080/web160910/printTable03.jsp?rownum=5&colnum=8

参数放在协议头上,地址栏里直接能看见,不安全

2.post请求(只有表单可以设置post请求,设置method=post)

例:http://127.0.0.1:8080/web160910/printTable03.jsp

参数放在协议体里,地址栏里看不见,安全

表单请求处理过程:

1.tomacat接收到请求就创建一个request内置对象,用来接收请求的参数;request内置对象的数据结构就map集合,key和value都是String类型;

2.tomcat到对应的项目名下的子目录里找相应的组件,从request里拿参数request.getParameter,处理请求;

3.请求处理完,服务器通过response内置对象把结果信息交给http协议传回浏览器显示;

4.最后把request和response对象全部销毁;

表单的异常处理

行和列的参数要转换成int,如果用户输入了不可转换成int类型的字符时,就会出NamberFomatException异常,此时用try catch拦截,在try语句块里出异常的代码后面的代码不会被执行,但try语句块后面的代码会继续执行;

发布了20 篇原创文章 · 获赞 25 · 访问量 2163

猜你喜欢

转载自blog.csdn.net/qq_38992372/article/details/104219199