サーブレット開発技術


序文

提示:这里可以添加本文要记录的大概内容:

JavaWeb プロジェクトを作成する前にTomcatおよび JavaWeb ツールをダウンロードしてください

以下の図は JavaWeb ツールのコード プロンプトを示しています。独自のものかどうかを確認できます。
ここに画像の説明を挿入


サーブレットプロジェクトを作成する

提示:以下是本篇文章正文内容,下面案例可供参考

初めて JavaWeb プロジェクトを生成する:動的 Web プロジェクトを作成する
ここに画像の説明を挿入
後で JavaWeb プロジェクトを生成する:
ここに画像の説明を挿入
ステップ 1: HttpServlet を継承する
ステップ 2: @WebServlet アノテーションを追加、アドレスを設定する
ステップ 3: doXXX メソッド (計 7 種類) を書き換え、リクエストを処理し応答する

コード固有の操作:

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;
//第二步:增加@WebServlet注解,配置地址
@WebServlet("/hello")   
					 //第一步:继承HttpServlet
public class HelloServlet extends HttpServlet{
    
    
//第三步:重写doXXX方法,处理请求并响应
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    

		
	}
}

リクエストを処理して応答する

リクエストを処理する

		//处理请求
		//1.获取请求中的数据
		//调用HttpServletRequest中的方法getParameter("数据名")
		String name = req.getParameter("name");
		//2.具体处理
		System.out.println("前端发送的数据是"+name);

対応するタイプは以下の3つです

テキスト/プレーン、プレーンテキスト

//生成纯文本格式的响应
//1.调用HttpServletResponse中的setContentType方法设置内容类型
resp.setContentType("text/plain;charset=utf-8");
//2.调用HttpServletResponse中的getWriter方法输出响应内容
PrintWriter writer = resp.getWriter();
writer.print("Hello, world!");
writer.flush();

上記のコードは、応答のコンテンツ タイプを text/plain に設定し、文字列「Hello, world!」を出力します。content を出力した後にメソッドを呼び出すとflush()、コンテンツが出力ストリームにフラッシュされることに注意してください。

出力効果:
ここに画像の説明を挿入

テキスト/html、htmlコード

//生成 HTML 代码格式的响应
//1.调用HttpServletResponse中的setContentType方法设置内容类型
resp.setContentType("text/html;charset=utf-8");
//2.调用HttpServletResponse中的getWriter方法输出响应内容
PrintWriter writer = resp.getWriter();
writer.print("<html><head><title>Hello, world!</title></head><body><h1>Hello, world!</h1></body></html>");
writer.flush();

出力効果:
ここに画像の説明を挿入

application/json、JSON形式の文字列

学生クラス:

public class Student {
    
    
	private String name;
	private String sex;
	public Student() {
    
    
		super();
		// TODO 自动生成的构造函数存根
	}
	public Student(String name, String sex) {
    
    
		super();
		this.name = name;
		this.sex = sex;
	}
	public String getName() {
    
    
		return name;
	}
	public void setName(String name) {
    
    
		this.name = name;
	}
	public String getSex() {
    
    
		return sex;
	}
	public void setSex(String sex) {
    
    
		this.sex = sex;
	}
	
}

サーブレットクラス:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
import po.Student;
@WebServlet("/hello")   
public class HelloServlet extends HttpServlet{
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		
		//处理请求
		//1.获取请求中的数据
		//调用HttpServletRequest中的方法getParameter("数据名")
		String name = req.getParameter("name");
		//2.具体处理
		System.out.println("前端发送的数据是"+name);
		
		//生成响应
		//1.调用HttpServletResponse中的setContentType 设置内容类型
		resp.setContentType("application/json;charset=utf-8");
		//2.调用HttpServletResponse中的getWriter 输出流
		PrintWriter writer = resp.getWriter();
		Student s1 = new Student("张三","男");
		Student s2 = new Student("李四","女");
		ArrayList<Student> list = new ArrayList<>();
		list.add(s1);
		list.add(s2);
		Gson gson = new Gson();
		
		writer.print( gson.toJson(list));
	}
}

出力効果:
ここに画像の説明を挿入

サーブレットのライフサイクル

  1. ロードフェーズ: コンストラクターの呼び出し
  2. 初期化フェーズ: init メソッドの呼び出し
    サーブレット操作をサポートする Web コンテナは、クライアントからリクエストを受け取ると、まずユーザーがリクエストしたサーブレット オブジェクトが存在するかどうかを判断し、存在しない場合は、サーブレット クラスをロードし、サーブレット オブジェクトを作成し、サーブレット メソッドを呼び出して初期化する必要がありますinit()
  3. サービス フェーズ: 返送されたリクエストを処理するためにサービス メソッドを呼び出します。コンテナは、
    このクライアント リクエストのオブジェクトServletRequestとスレッドを作成し、ServletResponseサーブレット オブジェクトのservice( )メソッドを呼び出し、service()クライアントのリクエスト メソッドに従ってdoGet()メソッドまたはメソッドを間接的に呼び出しますdoPost()
    service() メソッドの実行が終了すると、応答が生成され、コンテナーはその応答をクライアントに送り返します。
  4. 破棄フェーズ: destroy メソッドを呼び出して破棄します。 Web アプリケーションがアンインストールされるか、サーバーがシャットダウンされると、コンテナーは
    、このクライアント要求に対して作成されたServletRequestオブジェクトServletResponseと対応するスレッドを破棄します。このとき、destroy()リソースを解放するメソッドが呼び出されます。

サーブレット クラスのロード、サーブレット オブジェクトの作成、初期化メソッド init () の呼び出し、およびメソッド destroy () の破棄は、サーブレットのライフ サイクル全体で 1 回だけであることに注意してください。

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;
@WebServlet(urlPatterns = "/life",loadOnStartup = 5)
public class LifeCycleServlet extends HttpServlet{
    
    

	public LifeCycleServlet() {
    
    
		System.out.println("构造方法调用了");
	}
	@Override
	public void init() throws ServletException {
    
    
		// TODO init自动生成的
		System.out.println("init方法调用了");
	}
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		System.out.println("service方法调用了");
	}
	@Override
	public void destroy() {
    
    
		// TODO 自动生成的方法存根
		System.out.println("destroy方法调用了");
	}
}

プロジェクト実行後のコンソール出力:
ここに画像の説明を挿入
第 4 段階: 破棄ステージ。破棄メソッドを呼び出して破棄します。

「サーバー」で Tomcat を右クリックして停止し
ここに画像の説明を挿入
、コンソールに戻ります。
ここに画像の説明を挿入

サーブレットのライフサイクル全体を通じて呼び出されるメソッド

サーブレットには、ライフサイクル全体を通じてサーバーによって自動的に呼び出されるいくつかのメソッドがあり、主なメソッドは次のとおりです: メソッド: 初期
init( )化に使用されます
Destro( )メソッド: リソースの解放に使用されます
service( )メソッド: ユーザーの要求を処理し、ユーザーに応答するサービス クラスのメソッド ほぼすべての処理機能がここで完了します。service( )通常、メソッドは doGet( ) または doPost( ) メソッドを呼び出します。
doGet( )メソッドは get メソッドのリクエストに応答でき、doPost() メソッドは post メソッドのリクエストに応答できます。

通常、service( ) メソッドを直接書き換えることは推奨されませんが、doGet( ) または doPost( ) メソッドを書き換える必要があります。通常、フォームの送信には post メソッドが、ハイパーリンクには get メソッドが使用されることが多いです。

サーブレットの動作原理

ここに画像の説明を挿入

CORS クロスドメイン設定

CORS は、Web アプリケーションが異なるドメイン名またはポートからリソースを要求できるようにし、同一生成元ポリシーの制限を解除するメカニズムです。これはカスタムのリクエスト ヘッダーとレスポンス ヘッダーを追加することで実現され、Web サーバーが提供するアクセス ポリシーでは、異なるドメインからのリクエストによるリソースへのアクセスが許可または拒否されます。CORS は Web アプリケーションの開発を容易にし、クロスオリジン リクエストをより便利にします。

まず、簡単なユーザーログイン機能を実現するためのサーブレットをJavaWebで作成します。
ログインするときは、ユーザー名とパスワードを渡す必要があります。ユーザー名が admin、パスワードが 111 の場合、ログインは成功し、戻り結果は「成功」になります。それ以外の場合、戻り結果は「失敗」になります。
同時に、クロスドメインの非同期リクエストを許可するリクエスト ヘッダーが応答に追加されます。最後に、フロントエンド ページで使用できるように、結果が PrintWriter を通じて応答に書き戻されます。

バックエンドコード:

// 前后端分离项目
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;

@WebServlet("/login")
public class LoginServlet extends HttpServlet{
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		String name = req.getParameter("name");
		String pwd = req.getParameter("pwd");
		
		String result = null;
		// ==判断的是内容
		if (name.equals("user") && pwd.equals("123456")) {
    
    
			result = "成功";
		} else {
    
    
			result = "失败";
		}  
		
		//允许跨域 异步请求                                                        * 代表所有
		resp.setHeader("Access-Control-Allow-Origin", "*");
		//我的响应类型  纯文本
		resp.setContentType("text/plain;charset=utf8");
		//得到字符输出流
		PrintWriter writer = resp.getWriter();
		//将变量result的值输出到控制台或文件中
		writer.print(result);
	}
}

Tomcat を起動し、元のリンクの後に疑問符を付けて名前とパスワードの値を追加します。?name=user&pwd=123456

ここに画像の説明を挿入

次にフロントエンドのコードを書きます。

Routerジャンプがあるため、関数を選択するときに追加します。
ここに画像の説明を挿入
プロジェクトが成功したら axios フレームワークをインストールします。プロジェクトにnpm i axios
ここに画像の説明を挿入
入った後、ルーター フォルダーにあるindex.js ファイルを開きます。また
ここに画像の説明を挿入
、ルート コンポーネントを除くすべてのサブコンポーネントを削除します
。ルート コンポーネント内の Home、About、およびすべてのスタイルを削除し、ルーティング出口を 1 つだけ残します

削除後の表示:
ここに画像の説明を挿入
次に、2 つの新しいサブビュー LoginView と IndexView を作成します。

ホーム ページ ビューに h1 タグを追加します。ビューの目的を示すだけです。

    <h1>欢迎访问首页视图</h1>

また、ログイン ビューに h1 タグを追加します。必要なのは、このビューの目的を示すことだけです。

    <h1>登录视图</h1>

ビューの書き込み後にルーティングを構成します:index.js

  1. インポートビュー
import LoginView from '@/views/LoginView'
  1. ビューのルーティングを設定する、3 つの設定項目
  {
    
    
    path: '/',
    name: 'login',
    component: LoginView
  },
  {
    
    
    path: '/index',
    name: 'index',
    component: () => import('@/views/IndexView')
  }
]

ターミナルに戻って開始します。

ここに画像の説明を挿入
次に、ログイン ビューにコンテンツを追加します (2 つの入力ボックス、ボタン、エラー メッセージ)。

<template>
  <div>
    <h1>登录视图</h1>
    名: <input type="text" v-model="name"><br>
    密: <input type="text" v-model="pwd">
    <p v-show="isError">用户名或密码输入错误</p><br>
    <button @click="login">登录</button>
  </div>
</template>

次にdataにname、pwd、isErrorのデータを設定します

  data () {
    
    
    return {
    
    
        name: '',
        pwd: '',
        isError: false
    }
  },

次に、メソッドにログイン定義を追加します

  methods: {
    
    
    login(){
    
    

    }
  },

ここでリクエストの送信を完了しaxios、対応するデータを処理します。

最初のインポート:

import axios from 'axios'

次にリクエストを書きます。

  methods: {
    
    
    login(){
    
    
                                                        // 模板字符串拼接动态数据
        axios.get(`http://localhost:8888/CORS/login?name=${
      
      this.name}&pwd=${
      
      this.pwd}`)
        .then((resp) =>{
    
    
          // 处理服务器后端发回的响应,使用箭头函数
          // 判断相应的数据成功还是失败
          if ( resp.data =='成功' ) {
    
    
            this.$router.push('/index')
          } else {
    
    
            // 失败显示错误提示
            this.isError = true
          }
        })
    }
  },

最後に、ログイン ビューの完全なコード: (コンテンツを豊富にするためにスタイル コードを追加します)

<template>
  <div class="login-container">
    <h1>用户登录</h1>
    <form>
      <div class="form-field">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" v-model="name">
      </div>
      <div class="form-field">
        <label for="password">&nbsp;&nbsp;&nbsp;:</label>
        <input type="password" id="password" name="password" v-model="pwd">
      </div>
      <p v-show="isError" class="error-text">用户名或密码输入错误,请重新输入</p>
      <button @click="login" class="login-btn">登录</button>
    </form>
  </div>
</template>

<script>
import axios from 'axios'
export default {
    
    
  data () {
    
    
    return {
    
    
        name: '',
        pwd: '',
        isError: false
    }
  },
  methods: {
    
    
    login(){
    
    
                                                // 使用模板字符串拼接动态数据
      axios.get(`http://localhost:8888/CORS/login?name=${
      
      this.name}&pwd=${
      
      this.pwd}`)
        .then((resp) =>{
    
    
          // 处理服务器后端发回的响应,使用箭头函数
          // 判断相应的数据成功还是失败
          if (resp.data == '成功') {
    
    
            this.$router.push('/index')
          } else {
    
    
            // 失败显示错误提示
            this.isError = true
          }
        })
    }
  },
  components: {
    
    },
  computed: {
    
    },
  watch: {
    
    },
  mounted () {
    
    }
}
</script>

<style scoped>
.login-container {
    
    
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-top: 50px;
}

form {
    
    
  display: flex;
  flex-direction: column;
  align-items: center;
  background-color: #f6f6f6;
  padding: 20px;
  border-radius: 5px;
  box-shadow: 0px 1px 5px #ccc;
}

.form-field {
    
    
  display: flex;
  flex-direction: row;
  align-items: center;
  margin-bottom: 20px;
}

.form-field label {
    
    
  font-size: 18px;
  margin-right: 10px;
}

.form-field input {
    
    
  font-size: 18px;
  padding: 5px;
  border-radius: 3px;
  border: 1px solid #ccc;
  flex: 1;
}

.error-text {
    
    
  color: red;
  font-size: 18px;
  margin-top: 10px;
}

.login-btn {
    
    
  font-size: 18px;
  font-weight: bold;
  color: white;
  background-color: #4CAF50;
  border: none;
  border-radius: 5px;
  padding: 10px 20px;
  margin-top: 20px;
  cursor: pointer;
}

.login-btn:hover {
    
    
  background-color: #3E8E41;
}
</style>

出力効果:
ここに画像の説明を挿入


おすすめ

転載: blog.csdn.net/rej177/article/details/131711654