java web——servlet+jsp實現前後臺交互

大學生涯終於結束,在公司學習了一段時間的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代碼,也是爲了解耦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章