早期发展:
早期项目没有分层的概念,全部都是用jsp来完成,没有可维护性;
随着控制层从Model1体系中独立出来,jsp渐渐只作为视图组件,而现在很多新技术已经开始淘汰jsp;
概念:
服务端基于java语言的网页技术
语法特点:
把java程序以<%%>的形式,嵌入到html的页面中;
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不打开通过信道直接发送给浏览器处理;
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特点(简单举例):
1.面向对象,一次编写到处运行;
2.跨平台(线程和AWT不跨平台);
jsp特点:
1.重新定向:如,jsp登陆成功转到成功页面,登陆失败转到失败页面;
2.传输数据:如,业务层拿到结果数据放到内置对象里,jsp从内置对象拿到结果信息进行渲染;
3.动静分离:内容的生成和显示是分离的(由于动态代码和静态代码执行的工具不同),便于维护;
4.使用可重用组件;
5.使用标签,简化了开发;
6.具有Java所有优点;
7.容易整合到多种应用体系结构中;
超链接——get请求;
表单——post请求,更安全,数据放在HTTP协议体里;
静态注释:
1.静态代码的注释,静态注释会被发送到浏览器,由浏览器处理,客户端可通过查看页面的源代码发现这些显示注释;
2.基本形式:;
3.该形式也可以用作配置文件的注释,只是给tomcat或框架一种指导思想,不会执行;
动态注释:
1.动态代码的注释,由服务器(JDK)处理,不会被发送给浏览器显示;
2.动态代码:原生java代码,标签,表达式、指令;
3.也可以直接使用原生的java注释(单行注释和多行注释),还是由服务器处理,不会发送给浏览器显示;
4.基本形式:<%--注释--%>;
注释的优点:便于维护,可读,便于调试,便于开发
全局变量:
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内置对象(更好);
结论:表达式输出更简单,因此推荐使用表达式输出;
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 = "被包含页面"%>,标签
3.指令包含不管类型;标签识别被包含页面的类型
4.指令不可以传参,标签--动态页面--可以传参
5.实质:指令--先包含,后执行,标签:动态页面--先执行,后包含;静态页面--先包含,不执行;
6.缺陷:指令--被包含页面不能有html标签,如果被包含页面和当前页面有相同定义的变量,会出现编译错误;
标签---不能有html标签,不要有静态页面,容易出错;
结论:尽量用动态页面--用标签包含;
标签只能用在jsp页面里,对结果信息进行处理(渲染);
<%=request.getParameter("ref1")%>
<%=request.getParameter("ref2")%>
<jsp:forward page="forwardDemo02.jsp"/>
服务端跳转:
只在前台发送一次请求,只有一个request内置对象,可以在后台的各个组件之间互相传递;
在客户端只能看到一个请求,相对安全;
附加知识点
表单
使用表单的目的:方便和用户交互;自动生成HTTP协议;安全;
示例:
JSP
输入表格的行数与列数,进行表格打印操作
请求发送方式:
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语句块后面的代码会继续执行;