本文主要参考自W3Cschool的JSP教程和PPT,以及来自我与一位很强的学长的聊天记录。
这部分我是很早就看别的同学用过但是自己一直没有用过,现在终于开始接触了。
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
按照我的理解,JSP就是一个能让你写动态页面更方便的东西。
- 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
- Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
- JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
- JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
- Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
- Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
- 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。
我的理解就是,应该可以不用裸写Servlet了。目前我还没有写过JSP,等实验之后才知道对不对。
编译阶段:
servlet容器编译servlet源文件,生成servlet类
初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
执行阶段:
调用与JSP对应的servlet实例的服务方法
销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
<html>
<head>
<title>Hello Worldtitle>
head>
<body>
Hello World!
<br />
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
body>
html>
看了这个示例之后我其实有一点没看明白的地方,就是为什么会有out和request两个变量没有声明就可以用了?这说明jsp肯定有一些内置的对象,于是我搜了一下,总共有9个内置对象。随便贴个链接给大家看一下。
<% 代码片段 %>
<%! declaration; [ declaration; ]+ ... %>
如
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
<%= 表达式 %>
如
<html>
<head>
<title>A Comment Testtitle>
head>
<body>
<p>
Today's date: <%= (new java.util.Date()).toLocaleString()%>
p>
body>
html>
其实感觉会了语法就可以开始写了…但是事情没有这么简单,4-1的作业需要必须要用MVC,所以下面就开始MVC的学习。
其实没有搞明白MVC,于是找了一位现在在做架构师的学长问了一波问题……将我们的聊天记录整理了一下。下面用A来表示我,B表示学长。
A: X哥(学长要求匿名),我想问你一个关于MVC的问题。
我记得以前软工课讲过的MVC,好像不是这个样子啊。
B: 奥,我的理解是MVC和分层的层面不一样,所以没有可比性。 软工二上比较MVC和分层的意义不大。一般提到 MV* 就是指展示层的技术。
A: 感觉MVC是不是比分层要微观一些。
B: 对,MVC我只知道两个地方可以用,一个是客户端或者前端,一个是Java系的web框架。前端自己有时候也把架构叫做mvc,又发展出mvp,mvvm啥的,和后台的mvc是并存的。
A: 后台为什么会有v层啊
B: 你之前是怎么做网页的
A: 我之前都是写后端的,不写网页。
B: 那你是把数据转成json传过去?
A: 嗯是的。
B: 比如jsp吧,他是运行时后台输出好一份html代码然后返还回去。所以jsp定义的是html的生成规则,输出的是页面显示的内容,所以叫view。model没有方法。javaWeb版的MVC的 model == VO。
A: 哦那也就是说,C 只能是业务逻辑了?
B: 也不是,c没有业务逻辑,他是转发给下一层,但是下一层不是model,已经和mvc没关系了。
B: 为了简化先假设前端非常简单,只是一些静态html,没有js。
对于第3步,比如你的页面要显示你的用户名和头像
UserVo userVo = new UserVo( username, avatarUrl ); //UserVo就是model
一般都是创建个新对象。
对于第4步,这里实际上是controller调view,view就像是一个能生成html的子方法一样。
A: 比如view 有个方法可以传一个参数UserVo?
B: 对。
B: 第六步嘛,一般有各种方式,可能框架帮你做了,可能要你手动做。像springMVC自动化程度比较高,写出来确实是
UserVo function() {
return new UserVo();
}
但不是返回给了view,而是框架帮你做了
String html = view(userVo);
return html;
B: 奥还有一点,后台web框架的MVC和 前端/客户端的MVC不是一回事,比如你的前端队友说我们不用mvc了,用mvvm吧,你要知道这和你关系不大。
A: 那我们之前那种传json的方法是不是就不属于MVC啊
B: 是
A: 那那个属于什么啊
B: 可以叫API后台吧
接下来是PPT中的内容
Client makes a request (Web browser).
Servlet gets the client’s request.
Servlet determines which program elements (JavaBeans, EJBs or otherobjects) are required to carry out the specified request.
JavaBeans or EJBs perform the business logic operations for theservlet, and encapsulate the results.
应该由servlet,而非JSP页面,创建所有的数据对象。
因此,为了保证JSP页面不会创建对象,我们应该使用
... type="package.Class" />
而不是
... class="package.Class" />
因此,应该只使用jsp:getProperty,不使用jsp:setProperty