Servlet應用

Servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容。

在Java Web工程中找到WebRoot,會發現裏面有一個index.jsp網頁。

(可以自己創建一個頁面)注:常用 pageEncoding="UTF-8"

  • jsp 指令<%%> 腳本 表達式<%=%>
    一系列完整頁面:

1.web.xml

(主要是可以找到其中各種Servlet類的地址,應用於form action中)

<?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">
  <display-name></display-name>
  <servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.servlet.UserServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserAddServlet</servlet-name>
    <servlet-class>com.servlet.UserAddServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserUpdateServlet</servlet-name>
    <servlet-class>com.servlet.UserUpdateServlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserUpdate2Servlet</servlet-name>
    <servlet-class>com.servlet.UserUpdate2Servlet</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UserDeleteServlet</servlet-name>
    <servlet-class>com.servlet.UserDeleteServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/servlet/UserServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UserAddServlet</servlet-name>
    <url-pattern>/servlet/UserAddServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UserUpdateServlet</servlet-name>
    <url-pattern>/servlet/UserUpdateServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UserUpdate2Servlet</servlet-name>
    <url-pattern>/servlet/UserUpdate2Servlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UserDeleteServlet</servlet-name>
    <url-pattern>/servlet/UserDeleteServlet</url-pattern>
  </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2.主要頁面

【login.jsp】

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>login</title>
 
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	
  </head>
  
  <body>
    <div align="center">
     	 <!-- url-pattern中的路徑 -->
    	<form action="servlet/UserServlet" method="post">
    		用戶名:<input type = "text" name = "username"/><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    		密碼:<input type = "password" name = "password"/>
    		<input type = "submit" name = "登錄"/>
    		
    	</form>
    </div>
  </body>
</html>

在這裏插入圖片描述在這裏插入圖片描述
【userlist.jsp】
(這個頁面主要是用來顯示數據信息,然後可以進行編輯和刪除)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'userlist.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
<body>
    <div align = "center">
    	<table border = "1" >
    		<tr>
    			<td>Id</td>
    			<td>用戶名</td>
    			<td>密碼</td>
    			<td>年齡</td>
    			<td>編輯</td>
    			<td>刪除</td>
    		</tr>
    		<!-- EL表達式  前臺頁面接值  :作用域 session(一次會話)  只要不關閉瀏覽器,信息就保存在session裏
    		 request response page   (jsp內置對象)-->
    		<c:forEach items="${userlist}" var="list">
    		<tr>
    			<td>${list.id}</td>
    			<td>${list.username}</td>
    			<td>${list.password}</td>
    			<td>${list.age}</td>
    			<!-- get方法提交 -->
    			<td><a href="servlet/UserUpdateServlet?id=${list.id}">編輯</a></td>
    			<td><a href="servlet/UserDeleteServlet?id=${list.id}">刪除</a></td>
    		</tr>
    		</c:forEach>
    	</table>
    	<a href="useradd.jsp">增加</a>
    </div>
  </body>
</html>

在這裏插入圖片描述
【update.jsp】

(這個頁面是修改頁面,需要把數據都顯示出來,然後修改後進行提交。)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'update.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <div align="center">
     	 <!-- url-pattern中的路徑 -->
    	<form action="servlet/UserUpdate2Servlet" method="post">
    	<input type="hidden" name = "id" value="${user.id}"/>
    		用戶名:<input type = "text" name = "username" value="${user.username}"/><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    		密碼:<input type = "text" name = "password" value="${user.password}"/><br>
    		年齡:<input type = "text" name="age" value="${user.age}"/>
    		<input type = "submit" name = "提交"/>
    		
    	</form>
    </div>
  </body>
</html>

在這裏插入圖片描述
【useradd.jsp】

(這個是增加一條數據的頁面)

(其實和login幾乎一模一樣,除了對應的Servlet位置不同)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'useradd.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <div align="center">
     	 <!-- url-pattern中的路徑 -->
    	<form action="servlet/UserAddServlet" method="post">
    		用戶名:<input type = "text" name = "username"/><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    		密碼:<input type = "password" name = "password"/><br>
    		年齡:<input type = "text" name="age"/>
    		<input type = "submit" name = "提交"/>
    		
    	</form>
    </div>
  </body>
</html>

在這裏插入圖片描述
3.Servlet類

僅貼出主要部分代碼。

【UserServlet】
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		System.out.println("dopost");
		//確定編碼
		request.setCharacterEncoding("utf-8");
		//接值,參數必須和login中(用戶名和密碼)input標籤中的name值一樣
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println("用戶名:"+username+",密碼:"+password);
		User u = new User();
		u.setUsername(username);
		u.setPassword(password);
		
		//調用接口-多態 指向實現類
		UserInterface uif = new UserImpl();
		boolean bool = uif.loginSelect(u);

		if(bool){

			List<User> list = uif.selectUserAll();
			//利用session 作用域向頁面傳值HttpSession
			request.getSession().setAttribute("userlist", list);
			//重定向
			response.sendRedirect(request.getContextPath()+"/userlist.jsp");
		}else{
			//轉發
			request.getRequestDispatcher("/loginfail.jsp").forward(request, response);
		}

	}
【UserAddServlet】
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//字符編碼
		request.setCharacterEncoding("utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		int age = Integer.parseInt(request.getParameter("age"));
		
		User user = new User();
		user.setAge(age);
		user.setPassword(password);
		user.setUsername(username);
		
		UserInterface uif = new UserImpl();
		uif.addUser(user);
		
		List<User> list = uif.selectUserAll();
		//利用session 作用域向頁面傳值HttpSession
		request.getSession().setAttribute("userlist", list);
		//重定向
		response.sendRedirect(request.getContextPath()+"/userlist.jsp");
		
	}
【UserUpdateServlet】

注:這裏是用的doGet方法,至於doGet和doPost有什麼不同:

GET方式:安全性差
POST方式:安全性高

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		int id = Integer.parseInt(request.getParameter("id"));
		UserInterface uif = new UserImpl();
		User user = uif.selectUserById(id);
		request.getSession().setAttribute("user", user);
		response.sendRedirect(request.getContextPath()+"/update.jsp");
	}
【UserUpdate2Servlet】

爲什麼有兩個update呢?第一個是userlist超鏈接“編輯”所使用到的Servlet,第二個是表單提交以後所使用的到的Servlet。

兩個超鏈接“編輯”和“刪除”對應的Servlet是doGet方法,其餘爲doPost。

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		int id = Integer.parseInt(request.getParameter("id"));
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		int age = Integer.parseInt(request.getParameter("age"));
		
		User user = new User();
		user.setAge(age);
		user.setId(id);
		user.setUsername(username);
		user.setPassword(password);
		
		UserInterface uif = new UserImpl();
		uif.updateUser(user);
		
		List<User> list = uif.selectUserAll();
		//利用session 作用域向頁面傳值HttpSession
		request.getSession().setAttribute("userlist", list);
		//重定向
		response.sendRedirect(request.getContextPath()+"/userlist.jsp");
	}
【UserDeleteServlet】
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("doGet");
		request.setCharacterEncoding("utf-8");
		int id = Integer.parseInt(request.getParameter("id"));
		UserInterface uif = new UserImpl();
		
		uif.deleteUser(id);
		
		List<User> list = uif.selectUserAll();
		//利用session 作用域向頁面傳值HttpSession
		request.getSession().setAttribute("userlist", list);
		//重定向
		response.sendRedirect(request.getContextPath()+"/userlist.jsp");
	}

4.其他類
【User】

package com.pojo;

public class User {
	private Integer id;
	private String username;
	private String password;
	private Integer age;
	
	//快捷鍵:alt+shift+s
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password="
				+ password + ", age=" + age + "]";
	}
	
}

【UserInterface】

package com.bao;

import java.util.List;

import com.pojo.User;

public interface UserInterface {
	//查詢所有數據
	//返回的是很多個user類的list集合
	//list中不能放又有字符又有整型的數據,所以把數據放在User類裏,然後再把這些類放在list集合裏。
	public List<User> selectUserAll();
	//按id查找
	public User selectUserById(Integer id);
	//增加一條數據
	public void addUser(User u);
	
	public void deleteUser(Integer id);
	
	public void updateUser(User u);
	
	//登錄
	public boolean loginSelect(User u);
	
}

【UserImpl】

package com.Impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.bao.UserInterface;
import com.classone.DBUtil;
import com.pojo.User;

public class UserImpl implements UserInterface{
	public List<User> list = new ArrayList<User>();

	public List<User> selectUserAll() {
		try{
			//獲取數據庫連接權限
			Connection conn = DBUtil.getConnetion();
			//System.out.println(conn);
			//預編譯
			String sql = "select * from users";
			PreparedStatement ps  = conn.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();//查詢
			
			while(rs.next()){
				User user = new User();
				user.setUsername(rs.getString("username"));
				user.setPassword(rs.getString("password"));
				user.setId(rs.getInt("id"));
				user.setAge(rs.getInt("age"));
				list.add(user);
			}
			/*while(rs.next()){
				System.out.println("用戶名:"+rs.getString("username")+"年齡:"+rs.getInt("age"));
			}*/
		}catch(Exception e){
			e.printStackTrace();
		}
		return list;
	}

	public User selectUserById(Integer id) {
		
		try {
			Connection conn = DBUtil.getConnetion();
			//預編譯,?中不一定是什麼。寫了問號一定要賦值。
			String sql = "select * from users where id=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			//在?中放東西,第一個數字指的是給第1個問號賦值,第二個指賦的值。
			ps.setInt(1, id);
			ResultSet rs = ps.executeQuery();
			//ps.executeUpdate(); 增刪改查
			User user = new User();
			if(rs.next()){
				//把數據庫中找到的數據放到user類中的username中
				user.setUsername(rs.getString("username"));
				user.setAge(rs.getInt("age"));
				user.setPassword(rs.getString("password"));
				user.setId(rs.getInt("id"));
			}
			return user;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public void addUser(User u) {
		
		try {
			Connection conn = DBUtil.getConnetion();
			String sql = "insert into users (username,password,age) values(?,?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(3, u.getAge());
			ps.setString(1, u.getUsername());
			ps.setString(2,u.getPassword());
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void deleteUser(Integer id) {
		
		try {
			Connection conn = DBUtil.getConnetion();
			String sql = "delete from users where id=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, id);
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void updateUser(User u) {
		
		try {
			Connection conn = DBUtil.getConnetion();
			String sql = "update users set username=?,password=?,age=? where id=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, u.getUsername());
			ps.setString(2, u.getPassword());
			ps.setInt(3, u.getAge());
			ps.setInt(4, u.getId());
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public boolean loginSelect(User u) {
		
		try {
			Connection conn = DBUtil.getConnetion();
			String sql = "select * from users where username=? and password=?";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, u.getUsername());
			ps.setString(2, u.getPassword());
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				return true;
			}else{
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

	}
}

【DBUtil】

package com.classone;

import java.sql.Connection;
import java.sql.DriverManager;

//封裝連接數據庫
public class DBUtil {
	/*
	 * JDBC數據庫
	 * 1.導包
	 * 2.創建元素 URL USERNAME PASSWORD DRIVER 驅動
	 * 3.加載驅動
	 */
	private static final String URL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
	private static final String USERNAME="root";
	private static final String PASSWORD="489342182";
	private static final String DRIVER="com.mysql.jdbc.Driver";
	
	//連接數據庫需要的接口
	private static Connection conn;
	static{
		//加載驅動
		try {
			Class.forName(DRIVER);
			//獲取連接權限
			conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
		} catch (Exception e) {//Exception是所有異常的父類
			//try中有可能會出現異常,catch用來捕捉,捕捉的類型就是Exception。
			e.printStackTrace();
		}
	}
	public static Connection getConnetion(){
		//獲得連接數據庫的權限
		return conn;
	}
}

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