Java-JSP简单入门

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。
  • taglib:导入标签库资源
  • include:导入页面的资源
    • <%@ include file=”1.jsp” %> 这样就可以导入别的页面的内容了。

内置对象

不需要创建,直接使用,其实本质上是tomcat为我们生成的对象。

  1. pageContextPageContext类的对象,可以在当前页面共享数据。还可以获取其它的八个对象。
  2. requestHttpServletRequest的对象,用于在一次请求间共享(转发)数据
  3. sessionHttpSession类的对象,用于在一次会话中共享数据
  4. applicationServletContext类的对象,所有用户间共享,所以请谨慎使用。
  5. responseHttpServletResponse类的对象
  6. pagethis,当前页面的Servlet,是一个Object
  7. outJspWriter类的对象,字符输出流对象,可以直接将数据输出到页面上。这里需要注意一点的是:tomcat会先找response.getWriter的缓冲区,然后再去找out对象的缓冲区,所以out的内容永远在后面。
  8. configServletConfig类的对象
  9. exceptionThrowable,只有当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代码弄成一个个标签。

但是我个人觉得这东西真的没什么用了,所以我直接跳过了。