Servlet
想要学习servlet我们要先知道servlet是什么。我们都知道网页上的东西会通过我们想要得到的信息来进行与顾客的交互,那我们又是如何在只有一堆描述网页外观的外观上面来进行交互的呢?
在用户访问一个页面的时候,他会直接与这个网页的浏览器进行信息上的传递,通过各种网络协议来使得网络上的信息的完整性和安全性。
而servlet就是针对从客户端传送到服务器上的指令进行一定的回复,我们可以看看我从其他博客中找来的图片进行理解。
继承关系
知道了以上的概念,我们接下来具体来将一下servlet的相关知识。
我们要想在java中定义了一个类,这个类必须得是继承自一个servlet相关库里面的东西。
首先我们得先知道servlet这个东西在java中是一个接口,我们如果要实现里面的接口的话,我们就必须实例它里面的方法,当然这些方法在外面必要的程序运行中都是必须的。
其继承的关系就由我们看看我从其他博主那边寻来的一张关系图。
所以我们如果想要使用一个功能比较完整的servlet的话,可以直接继承httpservlet这样我们就可以直接获得到一个可以直接使用的servlet了。
getServletInfo()
这个方法会返回Servlet的一段描述,可以返回一段字符串。
getServletConfig()
这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象。
Servlet
这个比较重要,我们接下来将重点讲解。
生命周期
我们都知道一段运行程序想要进行一定的功能或者作用的话,那这个程序就必然有他的作用的地方和生命周期。
我们可以直接看看接口servlet中的有些什么相应要实现的功能。
下图是我接口servlet的结构。
我们可以看到这里面有几个必要的方法,其实这就是我们servlet生存必要的方法。
init()
init方法,正如其名,他就是servlet在刚创建之初,第一次接收到请求的时候,最先调用的一个方法,是初始化这个servlet必要的方法。
service()
每次进行请求的时候,都会先访问我们的servise方法,这也是我们运行的时候的主体所在。
destroy()
当我们要销毁掉这个Servlet的话,就会自动调用destroy这个方法,以防止我们在运行这个Servlet的时候开启着某个数据流,这样我们就可以将关闭数据流或者一些操作写进destroy中,以保证我们的程序安全正常的运行。
正如我们在idea中创建一个Servlet的文件的话,就会自动生成下面的一段代码。
并得到以下的结果。
可以看出这个程序改写了相应的init方法和destroy的方法,运用了doget的方法在我们访问这个网站的时候,将html语言通过输出流的方式传递给网页,使得我们获得了相应的“Hello World!”。
HttpServlet
接下来我们来具体讲讲Servlet为我们搭建好的一个较为完整的适用于网页的httpServlet的方法。
service()方法
我们之前看到idea为我们自动生成的代码中就运用了其他两个方法。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
if (req instanceof HttpServletRequest && res instanceof HttpServletResponse) {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
this.service(request, response);
} else {
throw new ServletException("non-HTTP request or response");
}
}
以上就是HttpServlet中的service方法,我们可以看见httpservlet提供了一个公开的service方法,然后将收到的ServletRequest和ServletResponse进行向下转换成为了httpservlet中运用的Request和Response重新传回另一个service方法。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
通过上面的代码我们会发现,这是一个在httpservlet里面的一个protected的方法,这就可以识别出不同的请求,然后调用相对应的方法中。
使用httpservlet的一大好处就是,我们没有必要对service进行修改,只要修改对应的doget和dopost即可。
ServletConfig接口
这个接口主要是在初始化的时候将web.xml文件中的关于这个Servlet的init-param进行一个记录,将其初始化进相应的ServletConfig中。
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>servletClass</servlet-class>
<init-param>
<param-name>key</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
这个其中的param可以是提前存储的密码、账户之类的等等。
映射方式
当我们在浏览网页的时候,时常会发现许多种情况,并且面对着不同的界面,就像主菜单栏上可能会显示注册或者登录等等,多种多样不同的请求,而不同的请求其实就对应着不同的Servlet,我们只要对应不同的Servlet进行不同的重写dopost或者doget方法即可。
而每一个不同的Servlet我们如何进行加以区别呢?实际我们只需要在web.xml中映射不同的url地址即可。
就像这个样子,我们就可以相应的url访问到这个网址啦。
这里面的servlet-name是我们的创建的Servlet的名称,servlet-class是我们这个Servlet所在的路径,servlet-mapping是我们这个Servlet的映射,相应的名字映射到相应的url上面去。
然而除了这种写法我们可以直接在Servlet的文件上方加一句语句。
这样我们就可以不用在web,xml上进行相应的部署了。
但是我们还要知道一件事情,web.xml文件中部署的映射的优先级是要高于在Servlet上方进行描述的。
Cookie
大致了解了下Servlet,我们来接下来了解一下Cookie。
我们在生活中常常会看到浏览器管理我们相应的Cookie,那么Cookie是什么呢?
其本质是一个键值对,可以在浏览器和用户端进行一个交换信息的操作,使得我们有时在初始化的时候就可以直接通过电脑中存储的Cookie码进行自动的认证。
这样可以减少用户操作的时间和次数。
Session
session是由服务器创建进行分发的,将session的值存储在服务器内部,并只提供sessionid进行外界的使用。因此,合理有用session可以使程序的安全性提升。
在Servlet中,Session是通过HttpSession接口来表示的,它通过HttpServletRequest.getSession()方法可以获得HttpSession对象。
MVC
MVC(Model-View-Controller)是一种常见的软件设计模式,它将应用程序的逻辑分离成三个独立的组件:
模型(Model):模型是应用程序的数据和业务逻辑的表示。它负责处理数据的读取、存储和操作,以及业务规则的处理。模型通常是独立于用户界面的,可以在不同的视图和控制器之间共享和重用。
视图(View):视图是用户界面的呈现部分,负责展示数据给用户,并接收用户的输入。视图通常是根据模型的数据进行渲染和更新的,它可以是Web页面、图形界面或命令行界面等。
控制器(Controller):控制器是模型和视图之间的协调者,负责接收用户的输入并根据输入调用相应的模型逻辑。控制器将用户的请求转发给模型进行处理,并将处理结果传递给视图进行展示。控制器还可以处理视图的事件和状态变化