JSP
首先,我们可以直接在jsp页面中定义html代码,也可以直接定义java代码。
其次,现在几乎不怎么使用jsp技术了,你看看哪个网站的页面还有jsp结尾的?所以我认为对它来说,简单理解即可。
原理
实际应用中的逻辑:假设访问服务器的index.jsp,服务器会将这个资源通过特定的方法转换为java文件(其中的类继承自HttpServlet),并且编译这个文件生成字节码。所以,jsp页面,其本质上就是一个servlet,它只是把其它的html代码帮你做了输出而已,让你不用在servlet中写一堆输出信息到页面上。
脚本
- <% 代码 %>:这里写的代码就是定义在service方法中的。
- <%! 代码 %>:定义的成员变量和成员方法。当然不建议使用。
- <%= 成员变量 %>:相当于service方法中的
System.out.println();
指令
主要是为了导入资源。
指令的语法:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>,具体有下面三种:
- page:配置jsp页面
- content-type:等同于
response.setContenType,就可以设置响应体的MIME类型和字符集 - language:写死的,就是java。原先java希望能够一统天下,但是最后野心失败了,这里就残留了这么一个东西…..
- buffer:就是out的输出缓冲。
- import:导包用的。
- errorPage:当前页面发生异常后会自动跳转到指定页面,不想让用户看到丑陋的500页面和异常信息。
- isErrorPage:标识当前页面是否是错误页面的跳转页面,指定为true就可以启用内置对象exception。
- content-type:等同于
- taglib:导入标签库资源
- include:导入页面的资源
- <%@ include file=”1.jsp” %> 这样就可以导入别的页面的内容了。
内置对象
不需要创建,直接使用,其实本质上是tomcat为我们生成的对象。
pageContext:PageContext类的对象,可以在当前页面共享数据。还可以获取其它的八个对象。request:HttpServletRequest的对象,用于在一次请求间共享(转发)数据session:HttpSession类的对象,用于在一次会话中共享数据application:ServletContext类的对象,所有用户间共享,所以请谨慎使用。response:HttpServletResponse类的对象page:this,当前页面的Servlet,是一个Objectout:JspWriter类的对象,字符输出流对象,可以直接将数据输出到页面上。这里需要注意一点的是:tomcat会先找response.getWriter的缓冲区,然后再去找out对象的缓冲区,所以out的内容永远在后面。config:ServletConfig类的对象exception:Throwable,只有当isErrorPage=true才可以使用这个对象。
MVC
首先我们来聊聊jsp的发展历程,了解了之后就会对为什么要提出MVC有个简单的认知了。
最最开始的时候,只有Servlet技术,那么在Servlet中处理java代码当然是非常舒服的,缺点就是你需要在response.getWriter.write("<html>.....")方法中写入大量的html代码,相当繁琐。
然后就有了JSP技术,确实方便了不少。但是!由于JSP页面里面,既有大量的Java代码,还有一些前端的诸如html代码、javascript代码,会显得非常庞大,于是我们就需要MVC技术来替我们解决这一难题:
- M(Model):模型,用来完成具体的业务操作,对应到Java中用的是Javabean来实现
- V(View):视图,用来展示数据,用的是JSP技术。
- C(Controller):控制器,用来获取用户的输入,同时将数据交给别的层次进行处理,用servlet来做。
简单来说的一次流程就是:浏览器首先发送数据给Servlet,也就是控制器,然后控制器获取了数据之后交给模型层,也就是javabean,它会去进行一些业务操作,完成之后再把数据给控制器,控制器再把数据交给展示层即可。
优点:耦合度低、重用性高
这里你可能会有一个疑惑,之前说了是因为JSP中既有大量的Java代码,又有前端的一些代码,那么我们怎么才能分离它们呢?用下面的两种表达式,可以大大简化操作。
EL表达式
替换和简化在jsp页面中Java代码的编写。语法:${表达式}。
如果不想使用,可以在$前加一个反斜杠来完成转义。
它有两大作用,第一个就是进行一些简单的计算,包括加减乘除、逻辑的与或非和比较的一些运算。这里新的只是点是一个叫empty的操作。可以用来判断是否为空(null)或者长度为0。empty string
第二个是从域对象中获取值:
- {域名.键名} ,键名就是我们自己设置的,域名有下面四种,对应了四种域:
- pageScope
- requestScope
- sessionScope
- applicationScole
- {键名}:从最小的域开始找,找到了就返回,否则继续找,直到找到位置。
- 如果要获取的不是一个字符串,而是一个自定义对象,那么可以使用它的属性来获取。比如
requestScope.user.name,这里会调用user对象的getName()方法,如果对象没有这个方法,就会报错。 - 如果要获取一个集合内的某个内容,只需要
list[0]这样的即可。 - 如果是一个map的话,需要用
map["name"]或者map.name都可以获取对应键的值。
同时EL自己也带11个隐式对象,这里只要掌握下pageContext可以获取其它的对象。
JSTL
java server page tag lib,JSP标准标签库。和EL一样是用来简化操作的,把Java代码弄成一个个标签。
但是我个人觉得这东西真的没什么用了,所以我直接跳过了。