大學生涯終於結束,在公司學習了一段時間的java web方面的知識,結合自己之前的一些理解,想通過幾篇文章來對我所接觸到的java技術進行梳理與總結,也希望能給大家一些參考,由於作者水平有限,難免存在一些不足之處,希望能一起探討!
1、servlet
Servlet 是 Java Web 技術的核心基礎。因而掌握 Servlet 的工作原理是成爲一名合格的 Java Web 技術開發人員的基本要求。Servlet本質就是一個服務端的java對象,在這個對象中有一些方法來對瀏覽器的請求進行處理,並反饋給瀏覽器。
1.1 Servlet與Servlet容器
首先我們應該理解Servlet與Servlet容器的區別與聯繫,Servlet容器是用來管理衆多Servlet的,有個比喻很好,Servlet容器和servlet就和槍與子彈的關係一樣,互相依存但又互相獨立,在tomcat中Servlet容器所對應的部分是Context容器,而一個web應用對應一個Context容器,因此一個web應用只有一個Servlet容器。在這裏不扯tomcat的內部實現方式,我們只需要記住Servlet容器所做的工作就是在程序運行開始之前對系統配置文件進行解析,將相關的Servlet對象、filter、lintener等信息進行整合與處理。
1.2 Servlet使用
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頁面。
2、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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
3、Servlet與jsp
那麼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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a herf="myFirstServlet">click</a>
</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中進行配置
<?xml version="1.0" encoding="UTF-8"?>
<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.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>myFirstServlet</servlet-name>
<servlet-class>com.lib.test.myFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myFirstServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4、結尾
在這裏需要說明一下,Servlet與jsp技術儘管是web技術中非常重要的一項,但現在已經被替代,我們想一下爲什麼,在系統變複雜時所有的web交互都用
Servlet來實現無疑是繁瑣冗餘的,因此它有不足之處。jsp技術仍然在應用但是也很少在jsp代碼中寫大量java代碼,也是爲了解耦。