这个世界上是先有鸡还是蛋呢?这个问题永远摸不清。。。。但是JSP和Servlet的关系却很明确,是先有的Servlet,在有的JSP!此篇是巩固一下框架前的基础,SPRing和SpringMVC都是和Servlet有关系的,复习一下基础会加深对框架的理解
一、Servlet 既然先有的Servlet,那就让我们先来聊聊Servlet。 1.什么是Servlet? 下面引用百度的一段定义:
Servlet(Server Applet),全称java Servlet,暂无中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet创建后需要继承HttpServlet,而其中初始化的doGet,doPost方法便是我们最常用到的,而自身的service方法包含了doGet和doPost方法。 我接下来要说的是Servlet中的加载流程(这个加载流程涉及到SpringMVC框架配置文件加载的基础),而对于它的概念再次不在多说,比较抽象,你可以把它想象为一个盒子,而这个盒子的外层包裹着一个比它大的盒子名为tomcat,而在它里面的盒子就是我们所写的一个个的web项目。
2.Servlet的加载流程:(接下来我用一个例子来说明)
①比如我们JSP中有个超链接做的get请求如下:
<a href="servlet/HelloServlet">Go</href>②创建一个Servlet,该Servlet需要继承HttpServlet这个抽象类,而HttpServlet类是继承了GenericServlet(也是抽象类)。
//此类是在web工程的src目录下直接创建的public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //控制台输出Get请求 System.out.println("处理Get请求。。。。"); //输出在网页上Hello Servlet! PrintWriter out = resp.getWriter(); resp.setContentType("text/html;charset = utf-8"); out.println("<strong>Hello Servlet!</strong><br>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(req, resp); }}③接下来我们web.xml中的配置
<servlet> <servlet-name>HelloServlet</servlet-name> //此处的类名要全拼,包括包名,而此处其实就对应了web框架的配置,比如SpringMVC中的DispatchServlet <servlet-class>servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>接下来说的是Servlet的加载流程:(各位客官看好!~) Get方式请求Servlet→Go 顺序是这样的:
前端页面的Get请求,通过点击Go来寻取到href这个链接 ↓web.xml中你配置的servlet-mapping中的url-pattern会拦截你的请求,此处是/拦截所有请求 ↓通过url-pattern来找到你的servlet-mapping中的servlet-name ↓此刻servlet-mapping中的servlet-name找到serlvet中对应servlet-name ↓serlvet中对应servlet-name找到对应的servlet-class 也就是我们所编写的java类 ↓找到我们所写的doGet方法就上面的加载流程而言,有没有觉得其实是和SpringMVC的加载流程是相似的,因为SpringMVC的Servlet类就是DispatchServlet,所以加载映射的流程也是和这个类似的
3.servlet与jsp九大内置对象的关系对应:
jsp对象 | servlet获得 |
---|---|
out | resp.getWriter |
request | service方法中的req参数 |
response | service方法中的resp参数 |
session | req.getSession() |
application | getServletContext() |
exception | Throwable |
page | this |
pageContext | PageContext |
Config | getServletConfig() |
4.Servlet的路径
//下面的写法表示根目录的路径Servlet的路径跳转问题:绝对路径的前缀String base = request.getContextPath();二、JSP
JSP是Servlet
JSP内置对象(不用new可以在JSP中直接使用) 一共分为九个: 常用的有:out,request,respone,session,application 还有几个不常用的:Page,pageContext,exception,config
out:
//我们在JSP打印输出最长用的内置对象就是out,例如out.print("");request和response: 这里这两个一起说
//用户发送请求request//在request对象中,我们最长用到的方法如下:通过这个方法我们可以获取html中的文本框内容,与之相应的是namerequest.getParamter("文本框的name");//关于跳转页面request.getRequestDispatcher("xx.jsp").forward(req,resp);//用上面的做页面的跳转,url不变,此行为是服务端行为,名为请求转发//服务器给用户响应response//在response方法也很多,我们可以通过reponse去添加cookie,给服务端response.addCookie();//关于跳转页面response.sendRediect("xx.jsp");//用上面的做页面的跳转,url会发生变化而且其实是发生了2次请求,名为请求重定向session:
在服务器的内存中保存这不同用户的sessionSession对象在第一个JSP页面被装载时自动创建,完成会话期管理Session对象是HttpSession类的实例//我们可以用一下方法来设置Session的最大存活时间session.setMaxInactiveInterval(10);//此处的括号里是以秒(/s)来作为单位注:创建新的会话,旧的会话SessionId扔存在服务器,除非会话自动超时。我们也可以通过在web.xml里配置session的超时时间<session-config> <session-timeout>10</session-timeout>//此处是min分钟做单位</session-config>application对象(属于服务器):
·application对象实现了用户间数据的共享,可以存放全局变量·application开始于服务器的启动,终止与服务器的关闭·在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作·在任何地方对application对象属性的操作,都将影响到其他用户对此的访问·服务器的启动和关闭决定了application对象的生命·application对象是ServletContext类的实例page对象:
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例pageContext对象:
·提供了对JSP页面内所有的对象及名字空间的访问·可以访问本页所在的session,也可以取本页所在的application的某一属性值·相当于页面中所有功能的集大成者·本类也叫pageContextJSP状态管理
①http协议的无状态性: 这里可以举个例子:就像一个故事:很久很久以前,有一个叫做“从前有座山”商店,店主是一个得了痴呆症的老和尚(这里是指web服务器),每次放学 小明都在这里买东西(客户端http发起请求),然而每次这个老和尚都记不住小明。所以有了以下的两大机制
②保存用户状态的两大机制 Session,和Cookie,Session是保存在服务端的,而Cookie是保存在客户端的也就是浏览器上。
③Cookie的创建与使用
Cookie cookie = new Cookie(name,value) 我们的Cookie在平时的项目里用到的最多的地方就是购物车的Cookie和用户登录时的记住秘密。
三、二者的区别
1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
后面还有一片与框架非常贴近的webServlet监听器(Listener)篇!
新闻热点
疑难解答