JSP_1th_第一个JSP程序

来源:互联网 发布:大数据时代 pdf 编辑:程序博客网 时间:2024/05/01 13:56
一、JSP(Java Server Page)
1、为什么需要JSP?
Servlet:
优点:逻辑处理方便。
缺点:页面表现麻烦。

JSP:
优点:页面表现方便。
缺点:逻辑处理麻烦。

所以要互补使用,一般项目采用:
jsp(页面表现)+servlet(业务逻辑)+javabean(数据处理)
(当然,学了ssh后,可以采用ssh框架)

2、举例
新建一个Web项目,取名为TestJSP,在其WebContent目录下,新建一个1.jsp文件,写入如下html代码:
<strong>aaaaaaaa</strong><p>bbbbbbbb</p>

这里就不再讲怎么部署项目,启动服务器的过程了,在浏览器访问:http://localhost:8080/TestJSP/1.jsp(在WebContent目录下的文件都位于Web项目的根目录下,jsp也是如此,不像Servlet一样还要指定<url-pattern></url-pattern>),页面效果:


可能第一印象都会觉得jsp就是html,好像没啥区别。

其实jsp和servlet的关系很密切:jsp就是servlet。

jsp是无法直接在页面被显示出来的,之所以会显示出jsp的部分是因为jsp经过转换变成了servlet,而servlet通过resp.getWriter().println()即可以字符串形式打印出html代码)


第一次访问某jsp文件时,才会对该jsp文件进行编译。(这也是为什么访问一个未被访问过的jsp会比较慢,而第二次访问就很快的原因)
JSP编译后生成的Java文件和Java类文件(即Servlet)都存放在Tomcat服务器的work目录下,在我的环境中是:
...\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\MyJSP\org\apache\jsp目录下,有一个_1_jsp.java和_1_jsp.class

在_1_jsp.java文件中,_1_jsp这个类继承了HttpJspBase,可以猜测HttpJspBase继承了HttpServlet:
public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase

_1_jsp中有几个方法,其中最重要的方法是public void _jspService():
public void _jspService(final javax.servlet.http.HttpServletRequest request,final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {final java.lang.String _jspx_method = request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)&& !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");return;}final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;final javax.servlet.ServletContext application;final javax.servlet.ServletConfig config;javax.servlet.jsp.JspWriter out = null;final java.lang.Object page = this;javax.servlet.jsp.JspWriter _jspx_out = null;javax.servlet.jsp.PageContext _jspx_page_context = null;try {response.setContentType("text/html");pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);_jspx_page_context = pageContext;application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();_jspx_out = out;out.write("<strong>aaaaaaaa</strong>\r\n");out.write("<p>bbbbbbbb</p>");} catch (java.lang.Throwable t) {if (!(t instanceof javax.servlet.jsp.SkipPageException)) {out = _jspx_out;if (out != null && out.getBufferSize() != 0)try {if (response.isCommitted()) {out.flush();} else {out.clearBuffer();}} catch (java.io.IOException e) {}if (_jspx_page_context != null)_jspx_page_context.handlePageException(t);elsethrow new ServletException(t);}} finally {_jspxFactory.releasePageContext(_jspx_page_context);}}
总结:
可以看到我们写的1.jsp中的两个标签变成了:
out.write("<strong>aaaaaaaa</strong>\r\n");out.write("<p>bbbbbbbb</p>");
也就是说jsp中写的html代码并不能直接显示到页面中,而是要经过jsp引擎转译为servlet,通过servlet来out.write()出jsp中的内容。

jsp引擎,将jsp文件转译为上述形式的java文件。

3、服务器内部是怎样处理用户对jsp文件的请求?
在C:\apache-tomcat-8.0.17\conf\web.xml中有如下代码:
...    <servlet>        <servlet-name>jsp</servlet-name>        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>        <init-param>            <param-name>fork</param-name>            <param-value>false</param-value>        </init-param>        <init-param>            <param-name>xpoweredBy</param-name>            <param-value>false</param-value>        </init-param>        <load-on-startup>3</load-on-startup>    </servlet>...    <!-- The mappings for the JSP servlet -->    <servlet-mapping>        <servlet-name>jsp</servlet-name>        <url-pattern>*.jsp</url-pattern>        <url-pattern>*.jspx</url-pattern>    </servlet-mapping>
即对于所有的jsp请求,服务器都会调用org.apache.jasper.servlet.JspServlet类对象,然后根据请求的名字1.jsp去找相对应的_1_jsp.java文件,如果还没有这个文件,建一个,如果已经有了,直接用。


二、JSP本质
1、JSP是一种动态网页技术。
1)动态生成网页数据,而不是由动态效果的网页。
2)常见的几种动态网页技术:
①JSP(Java Server Page)
②ASP(Active Server Page)
③PHP(Hypertext Preprocessor)超文本预处理语言

2、jsp就是servlet,所以jsp也是java类,通过jsp引擎把jsp转译成了servlet。

总结:
JSP工作过程:
①浏览器输入:http://localhost/MyJSP/1.jsp
②Tomcat收到*.jsp请求,则会到org.apache.jasper.servlet.JspServlet处理(Tomcat的web.html中有配置)

③JspServlet调用相应的java类,即jsp引擎根据1.jsp生成的java类(位于Tomcat目录work下面或是Eclipse的工程目录的work目录下:_1_jsp.java、_1_jsp.class)。
④执行_1_jsp.class,将HTML数据输出给Tomcat,Tomcat再将这些数据输出给客户端。

二、语法
之前,我们在1.jsp文件中随意写了两个标签,而没有写<html></html>、<body></body>等标签,就能被转义为对应的html文件,说明不论在jsp文件中写什么,都会被转义为文档的内容,如果直接写java代码,那代码的内容就会被显示在页面上,因为在jsp引擎来看,java代码就是没有任何语法意义的普通字符串。

所以要告诉JSP引擎这是一段Java代码,使用<%开头,以%>结束来把一段Java代码添加到jsp的html代码中。


在写第一个jsp程序之前,先来做点准备工作,因为我们在eclipse中做后台开发,此时也要写一些前端的代码,而eclipse对前端代码编写效率不高,为了让eclipse能更加高效的编辑前端代码,首先安装一款插件:Emmet。本来是想安装Aptana的,但是搞VPN翻墙去找官网的插件也是无法访问,报503,可能服务器在维修还是怎的,Emmet不需要翻墙也可以下载,具体怎样安装,百度eclipse安装emmet插件。

安装完后会提示重启eclipse,重启后就可以使用Tab键作为快捷键来写html、css了,但是jsp里好像不支持,这是因为在jsp中快捷键默认是ctrl+e,为了方便,在eclipse中找window - preferences,如下图所示输入em,找到emmet,然后把英文状态下的逗号和jsp加到那栏后面,点击确定,无需重启eclipse,直接就可以在jsp文件中敲html代码。


在first.jsp第一行敲一个感叹号!,然后敲Tab,html的doc、head和body都出来了。

完成如下代码:
<!doctype html><html lang="en"><head><meta charset="UTF-8" /><title>first JSP</title></head><body><%out.println("Hello World");out.println(new java.util.Date());%></body></html>

页面效果:




总结:

①JSP本身就是一个servlet。

②直接在HTML中内嵌JSP代码。

③JSP程序由JSP引擎先将它转换成Servlet代码,接着将它编译成类文件载入执行。

④只有当客户端第一次请求JSP时,才需要将其转换、编译。






1 0
原创粉丝点击