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>
密碼:<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>
密碼:<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>
密碼:<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;
}
}