大学生涯终于结束,在公司学习了一段时间的java web方面的知识,结合自己之前的一些理解,想通过几篇文章来对我所接触到的java技术进行梳理与总结,也希望能给大家一些参考,由于作者水平有限,难免存在一些不足之处,希望能一起探讨!
Servlet 是 Java Web 技术的核心基础。因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求。Servlet本质就是一个服务端的java对象,在这个对象中有一些方法来对浏览器的请求进行处理,并反馈给浏览器。
首先我们应该理解Servlet与Servlet容器的区别与联系,Servlet容器是用来管理众多Servlet的,有个比喻很好,Servlet容器和servlet就和枪与子弹的关系一样,互相依存但又互相独立,在tomcat中Servlet容器所对应的部分是Context容器,而一个web应用对应一个Context容器,因此一个web应用只有一个Servlet容器。在这里不扯tomcat的内部实现方式,我们只需要记住Servlet容器所做的工作就是在程序运行开始之前对系统配置文件进行解析,将相关的Servlet对象、filter、lintener等信息进行整合与处理。
Servlet在http请求的整个处理过程中应该是如下过程:(其中在web容器中可以有若干个Servlet)
用户浏览器操作发出http请求->web容器接收到请求->按照一定方法分配给指定的Servlet进行处理->Servlet将处理的结果反馈给浏览器进行显示
在eclipse中创建一个Servlet,如下所示:
package com.springmvc;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloWorld
*/
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWorld() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
可以看出该类继承于HttpServlet,并存在两个主要方法doget和dopost方法,分别来响应get和post请求来处理相应的业务,最后通过sendirect或者forward的方式跳转到想要去的jsp页面。
JSP全名为Java Server Pages,中文名叫java服务器页面,是一种动态网页技术标准,与传统的html不同,jsp是在服务端运行的,这里要明确一点jsp不是一种语言,而是一种技术,运用这种技术可以在html中用<% %>来实现java语言的书写,也就是在html页面实现了动态编程,但jsp页面还是属于前端页面部分。如下为新建的jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
body>
html>
那么Servlet与jsp的关系到底是什么,为什么jsp页面中还可以写java代码,这就得从他们的运行机制说起。一个工程运行后会加载所有的Servlet对象,同事也会扫描所有的jsp页面,将jsp页面转化为Servlet,在进行统一处理,因此一个jsp页面实质上也就是一个Servlet。
那么有一个问题了,既然二者相似那么为什么还要分出两个东西,其实用jsp我们完全可以实现一个简单的小网站,需要Servlet的原因就是为了前后台的分离,也就是所谓的解耦,web技术发展的很大一个推动力就是为了解耦,很多的技术都是为此而具有巨大优势,解耦的好处①提高问题的解决概率;②提高问题的解决效果;③提高问题的解决速度;④降低将来爆发隐患的可能性。下面我们通过一个小例子来了解servlet+jsp的实现。
新建工程,创建一个jsp页面:index.jsp,在body中我们加入一个连接,连接到相应的Servlet
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<a herf="myFirstServlet">clicka>
body>
html>
下来创建Servlet:myFirstServlet,并在servlet中作出一些处理并反馈
package com.lib.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class myFirstServlet
*/
@WebServlet("/myFirstServlet")
public class myFirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public myFirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out;
out=response.getWriter();
out.write("hello world!");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
这里需要在web.xml中进行配置
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jspwelcome-file>
welcome-file-list>
<servlet>
<servlet-name>myFirstServletservlet-name>
<servlet-class>com.lib.test.myFirstServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>myFirstServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
在这里需要说明一下,Servlet与jsp技术尽管是web技术中非常重要的一项,但现在已经被替代,我们想一下为什么,在系统变复杂时所有的web交互都用
Servlet来实现无疑是繁琐冗余的,因此它有不足之处。jsp技术仍然在应用但是也很少在jsp代码中写大量java代码,也是为了解耦。