![06e55e3e8ac3cb216e3facbf906092e2.png](https://img-blog.csdnimg.cn/img_convert/06e55e3e8ac3cb216e3facbf906092e2.png)
问题:
在学习了 Servlet 之后,使用 Servlet 进行页面的展现,代码书写过于麻烦。极大的影响了开发的效率,这样写真的很痛苦,很痛苦。。。( ╯□╰ )
![88ade81d635523c5e5a0172be135c9a1.png](https://img-blog.csdnimg.cn/img_convert/88ade81d635523c5e5a0172be135c9a1.png)
那么有没有一种方式可以让我们像以前写网页一样来进行网页的编程工作呢?
使用JSP技术:
概念:JSP 全名为 Java Server Pages,中文名叫 java 服务器页面,其根本是一个简化的 Servlet 设计,它 是由 Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准。
长什么样子,就是Eclipse、MyEclipse、IDEA等开发工具中,以.jsp结尾的文件,就是jsp页面
![5b2937d862c8d6ab250981115666280b.png](https://img-blog.csdnimg.cn/img_convert/5b2937d862c8d6ab250981115666280b.png)
特点:
1、里面既可以写Java代码,又可以写HTML代码,CSS样式,JS代码
2、表面上看着像一个HTML页面,其实本质上还是一个Servlet
当我们从浏览器访问一个jsp页面的图示如下:
![af1a67a263cded9c71a25b3a31af18fb.png](https://img-blog.csdnimg.cn/img_convert/af1a67a263cded9c71a25b3a31af18fb.png)
整个过程如下:这里我们以chenpeng.jsp这个jsp页面进行说明:
1、当我们在浏览器地址栏中输入了: http://localhost:8848/servlet01/chenpeng .jsp 访问服务器中的jsp页面
2、这时候我们项目的web.xml文件中并没有配置chenpeng.jsp这种路径
![392c78bdd7e7cc4746b6efb4152d9c0b.png](https://img-blog.csdnimg.cn/img_convert/392c78bdd7e7cc4746b6efb4152d9c0b.png)
3、服务器会去我们的Tomcat的web.xml配置文件中找匹配的路径:
![f51214e0a950c9af83f860d36f54a0be.png](https://img-blog.csdnimg.cn/img_convert/f51214e0a950c9af83f860d36f54a0be.png)
![3ace64ca577ec252d7603c2b3224f9fb.png](https://img-blog.csdnimg.cn/img_convert/3ace64ca577ec252d7603c2b3224f9fb.png)
![e562ee061c8ee63a6bcf4e678d5f9a23.png](https://img-blog.csdnimg.cn/img_convert/e562ee061c8ee63a6bcf4e678d5f9a23.png)
从上面图中可以看出,Tomcat自己的web.xml配置文件中有一个JspServlet,并且映射的url-pattern为——.jsp ,
也就能匹配我们自己的chenpeng.jsp
这里补充说一下Servlet的url-pattern匹配规则,我们知道jsp本质上也是一个Servlet
![dcda248a38595506c8310a69c677e1bc.png](https://img-blog.csdnimg.cn/img_convert/dcda248a38595506c8310a69c677e1bc.png)
4、服务器中的那个JspServlet(引擎),它会把我们的jsp文件,转译成.java文件,我们可以在我们自己安装的Tomcat中的work文件夹下看到:
![f4ce38968a27ee3aa7b894206bf163d1.png](https://img-blog.csdnimg.cn/img_convert/f4ce38968a27ee3aa7b894206bf163d1.png)
打开chenpeng_jsp.java文件,我们看
![08f3409d0cf63a68998b6dd972bab54e.png](https://img-blog.csdnimg.cn/img_convert/08f3409d0cf63a68998b6dd972bab54e.png)
![b187e4096960289d5ad5a40e07946f87.png](https://img-blog.csdnimg.cn/img_convert/b187e4096960289d5ad5a40e07946f87.png)
我们可以看到转译之后的这个java文件,它继承了HttpJspBase,HttpJspBase又继承了HttpServlet,所以本质上,它就是一个Servlet
5、有了这个转译之后的.java文件(其实就是一个Servlet),我们知道,Servlet是服务器会帮我们创建对象,执行service()方法,所以Java的代码服务器会帮我们执行,至于HTML,CSS,JS代码会原封不动的响应给浏览器,对了,还会加上服务器执行完的Java代码结果
![515a7ee1bf98ac704236c57e44c81587.png](https://img-blog.csdnimg.cn/img_convert/515a7ee1bf98ac704236c57e44c81587.png)
以上,就是jsp的访问原理的过程。
JSP页面的指令
![b744b7a31d95341927cec9bac27b5d8b.png](https://img-blog.csdnimg.cn/img_convert/b744b7a31d95341927cec9bac27b5d8b.png)
1、局部代码块:
![42c672f0ceef40d11ab3f902905bb512.png](https://img-blog.csdnimg.cn/img_convert/42c672f0ceef40d11ab3f902905bb512.png)
这种代码块,在这个jsp页面被转译成Servlet以后,它会写在Servlet的service方法中,
![89143ac3fd678b60c0655ffb3e9424d3.png](https://img-blog.csdnimg.cn/img_convert/89143ac3fd678b60c0655ffb3e9424d3.png)
2、全局代码块:
![73f8e13229fb7f90bdb8acf2ada9f34b.png](https://img-blog.csdnimg.cn/img_convert/73f8e13229fb7f90bdb8acf2ada9f34b.png)
这种写法会写在service()方法的外部
![51e8fe56d60d9818998aa11b46d96165.png](https://img-blog.csdnimg.cn/img_convert/51e8fe56d60d9818998aa11b46d96165.png)
3、Java脚本段、表达式
![74e0dab918788c106325e7b8b9dfab8f.png](https://img-blog.csdnimg.cn/img_convert/74e0dab918788c106325e7b8b9dfab8f.png)
![e9dbd87478ba4e5137e9b275686815ce.png](https://img-blog.csdnimg.cn/img_convert/e9dbd87478ba4e5137e9b275686815ce.png)
JSP中的注释
![2be726f2577f874373bc62d09c61801f.png](https://img-blog.csdnimg.cn/img_convert/2be726f2577f874373bc62d09c61801f.png)
![f3bee36dbdff2e4a6b8be6cb471cc5ea.png](https://img-blog.csdnimg.cn/img_convert/f3bee36dbdff2e4a6b8be6cb471cc5ea.png)
当我们访问doc.jsp页面时,可以右键查看源代码:
![26f81bedf9f8e9fdbcbfaa1c8b9b69db.png](https://img-blog.csdnimg.cn/img_convert/26f81bedf9f8e9fdbcbfaa1c8b9b69db.png)
JSP的动态引入和静态引入
静态引入相当于是复制进来,
![ef5bb391df8905132778663672492cd6.png](https://img-blog.csdnimg.cn/img_convert/ef5bb391df8905132778663672492cd6.png)
![943e927df843b870bc670c5475b00d09.png](https://img-blog.csdnimg.cn/img_convert/943e927df843b870bc670c5475b00d09.png)
动态引入相当于是参数的传递调用
![234c4af80de61de6b030e9e731f9587b.png](https://img-blog.csdnimg.cn/img_convert/234c4af80de61de6b030e9e731f9587b.png)
![cdbe7740f9f8a66633c543f584ef1d15.png](https://img-blog.csdnimg.cn/img_convert/cdbe7740f9f8a66633c543f584ef1d15.png)
![9ce1825953d49d68b857d71cb822cb5f.png](https://img-blog.csdnimg.cn/img_convert/9ce1825953d49d68b857d71cb822cb5f.png)
JSP中的forward指令学习
![60f92e634fb2a5a47b4b0457adb94787.png](https://img-blog.csdnimg.cn/img_convert/60f92e634fb2a5a47b4b0457adb94787.png)
![edd0070bec7c7220219987be0065097a.png](https://img-blog.csdnimg.cn/img_convert/edd0070bec7c7220219987be0065097a.png)
JSP中的9个内置对象
![326096320f7c106972875a0b0385dda2.png](https://img-blog.csdnimg.cn/img_convert/326096320f7c106972875a0b0385dda2.png)
![f7295fd6799f8798d03c682f3bd2647e.png](https://img-blog.csdnimg.cn/img_convert/f7295fd6799f8798d03c682f3bd2647e.png)
四大作用域:
![681f0a37ed6e7604f0cb80d2a9b8051b.png](https://img-blog.csdnimg.cn/img_convert/681f0a37ed6e7604f0cb80d2a9b8051b.png)
Sevlet中的请求转发和重定向的路径问题
1、使用相对路径
![a6097ad1436cce2a61e83ea043cd7d2d.png](https://img-blog.csdnimg.cn/img_convert/a6097ad1436cce2a61e83ea043cd7d2d.png)
上面的请求转发,和重定向,都是用的相对路径,访问都是没有问题的:
![ae9ce81270f94748a4aae3f1fafea7aa.png](https://img-blog.csdnimg.cn/img_convert/ae9ce81270f94748a4aae3f1fafea7aa.png)
它相对的是当前的Servlet,也就是说我们配置的Servlet是什么路径,它就换成如下:
http://localhost:8080/servlet01/chenpeng
* http://localhost:8080/servlet01/chenpeng.jsp
但是,这种相对路径,如果我们把web.xml中的Servlet的url-parten一换就有问题了:
![c6e70c17a6d139d2997ed5f662425190.png](https://img-blog.csdnimg.cn/img_convert/c6e70c17a6d139d2997ed5f662425190.png)
当我们访问http://localhost:8080/servlet01/one/chenpeng
![42dc610fa7e1dfd2f08c53bc3b9bdb2f.png](https://img-blog.csdnimg.cn/img_convert/42dc610fa7e1dfd2f08c53bc3b9bdb2f.png)
基于这个问题,绝对路径来了。。。。
2、绝对路径:
请求转发和重定向的绝对路径写法总结:
重定向:
在重定向中的路径中第一个/表示服务器根目录。
示例:
resp.sendRedirect("/虚拟项目名/资源路径");//重定向jsp页面
请求转发:
在请求转发中第一个/表示项目根目录
示例:
req.getRequestDispatcher("/资源路径").forward(req, resp);//请求转发到jsp页面
重定向的绝对路径:/表示服务器的根目录
![ccd13ce549f3b14584e4c28f8706a58c.png](https://img-blog.csdnimg.cn/img_convert/ccd13ce549f3b14584e4c28f8706a58c.png)
请求转发的绝对路径:/表示当前项目的根目录
![d941c0f68a3f17bf69a08f037623e436.png](https://img-blog.csdnimg.cn/img_convert/d941c0f68a3f17bf69a08f037623e436.png)
推荐使用绝对路径!!!!
JSP中的路径问题
1、相对路径:相对于当前的JSP(没有basePath)
![22ea59f86db2d24b59cb14b3241f8d2e.png](https://img-blog.csdnimg.cn/img_convert/22ea59f86db2d24b59cb14b3241f8d2e.png)
这种相对路径虽然没有问题,但是文件位置一换就路径错误了,不够灵活
2、相对于basePath:MyEclipse的JSP页面会有
在Myeclipse中创建的jsp页面会自动生成路径处理代码basePath,而basePath的值为当前项目根目录,并且在head标签中使用了<base href="<%=basePath%>">相当于将当前页面的资源全部默认定位为从项目根目录开始查找
![532c27f6163efdffe7e4f39e2b9ca869.png](https://img-blog.csdnimg.cn/img_convert/532c27f6163efdffe7e4f39e2b9ca869.png)
注意:
basePath方式和添加/方法只能二选一。
3、绝对路径:
在jsp中路径中的第一个/表示服务器根目录
最后,总结:
JSP 负责页面展现,Servlet 负责业务逻辑处理