第一章.初始Web程序
1.什么是C/S架構和B/S
C/S Client Server面向於客戶端,用戶通過客戶端跟程序進行交互(需要維護客戶端,成本較高)
B/S Browser Server面向於瀏覽器,用戶通過瀏覽器進行程序交互
2.URL:統一資源定位符(Uniform Resource Locator)
http :// localhost:8080 / news/index.html
URL組成:
http:協議,除此之外還有(FTP,HTTPS,RMI,DUBBO)
localhost:代表主機IP地址
8080:代表端口號
news/index.html:資源地址
3.Tomcat(Web服務器)
WebLogic
Ngnix
Resin
4.Tomcat:Web服務器,JSP/Servlet的容器
目錄介紹:
/bin 存放各種平台下用於啟動和停止Tomcat的腳本文件
/conf 存放Tomcat服務器的各種配置文件
/lib 存放Tomcat服務器所需的各種JAR文件
/logs 存放Tomcat的日志文件
/temp Tomcat運行時用於存放臨時文件
/webapps 當發布Web應用時,默認情況下會將Web應用的文件存放於此目錄中
/work Tomcat把由JSP生成的Servlet放於此目錄下
啟動方式:
/bin目錄下:startup.bat啟動腳本 shutdown.bat停止腳本
如果遇到閃退的問題則在上述兩個文件中添加如下代碼:
SET JAVA_HOME=D:\Java\jdk1.7 (java jdk目錄)
SET TOMCAT_HOME=E:\tomcat-7.0 (解壓后的tomcat文件目錄)
配置環境變量:
添加系統變量,名稱為CATALINA_HOME,值為Tomcat的安裝目錄,在Path系統變量中添加一個%CATALINA_HOME%\bin
5.Web工程:
Eclipse環境中新建一個Dynamic web project--->Target Runntime代表啟動的web服務器----->Dynamic Web model version代表項目版本(3.0)--->點擊Next直到
---->Generate web.xml xxxxx將此勾選上才在WEB-INFO文件夾下有web.xml文件
web.xml文件是web工程的配置文件,其中welcome-file-list代表首次訪問的頁面集合,welcome-file代表首次訪問的頁面
目錄結構:
/ Web應用的根目錄,該目錄下所有文件在客戶端都可以訪問(JSP、HTML等)
/WEB-INF 存放應用使用的各種資源,該目錄及其子目錄對客戶端都是不可以訪問
/WEB-INF/classes 存放Web項目的所有的class文件
/WEB-INF/lib 存放Web應用使用的JAR文件
6.JSP:Java Server Pages 可以在HTML頁面中嵌入Java腳本代碼
組成內容:
page指令:<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2"… 屬性n="屬性值n"%>
屬性 描述 默認值
language 指定JSP頁面使用的腳本語言 java
import 通過該屬性來引用腳本語言中使用到的類文件 無
contentType 用來指定JSP頁面所采用的編碼方式 text/html, ISO-8859-1
小腳本:<%Java代碼%>
表達式:<%=表達式%>
聲明:<%!聲明方法%>
注釋:<!--注釋-->;<%--注釋,頁面無法看見-->
第二章:JSP數據交互
jsp9大內置對象:
request 請求對象:可以獲取用戶提交請求的數據 可以對數據進行保存 轉發
response 響應對象:可以向頁面中響應數據 重定向
out 輸出對象
application 全局上下文對象
session 會話對象
page 當前頁面對象
pageContext
config 配置對象
exception 異常對象
一.假設用戶在頁面中輸入了一些數據,那么我們程序員如何在后台進行數據的獲取
request:請求
案例:注冊頁面
<!-- form表單提交方式
post:安全並且沒有數據長度限制
get:不安全,只能提交較小的數據
-->
<form action="request/checkdata.jsp" method="get">
用戶名:<input type="text" name="username"/><br/>
密碼:<input type="password" name="password"/><br/>
性別:<input type="radio" name="sex" value="man" checked="checked"/>男<input type="radio" name="sex" value="woman"/>女<br/>
愛好:<input type="checkbox" name="hobby" value="打籃球"/>打籃球
<input type="checkbox" name="hobby" value="踢足球"/>踢足球
<input type="checkbox" name="hobby" value="打豆豆"/>打豆豆<br/>
地址:<select name="city">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="guangzhou">廣州</option>
</select><br/>
<input type="submit" value="提交"/> <input type="reset" value="重置"/>
</form>
處理數據頁面
<%
//解決POST請求亂碼
request.setCharacterEncoding("UTF-8");
//用戶在頁面點擊提交就是發送了一條請求,那么我們在獲取數據時用的是request請求對象
String username=request.getParameter("username");
//解決GET請求亂碼
//username=new String(username.getBytes("ISO-8859-1"),"utf-8");
String password=request.getParameter("password");
String sex=request.getParameter("sex");
//獲取用戶提交的相同name屬性值
String [] hobbys=request.getParameterValues("hobby");
String city=request.getParameter("city");
System.out.println("姓名:"+username+"\t密碼:"+password+"\t性別:"+sex+"\t愛好:"+hobbys[0]+"\t地址:"+city);
%>
二.處理亂碼解決方案
POST處理亂碼:request.setCharacterEncoding("UTF-8");
GET處理亂碼方案一:
String username=request.getParameter("username");
//解決GET請求亂碼
//username=new String(username.getBytes("ISO-8859-1"),"utf-8");
GET處理亂碼方案二:
在Tomcat的Server.xml文件中添加URLEncoding
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
三.示例:登陸
login.jsp:
<form action="<%=basePath %>/login/check.jsp" method="post">
用戶名:<input type="text" name="username"/><br/>
密碼:<input type="password" name="password"/><br/>
<input type="submit" value="提交"/> <input type="reset" value="重置"/>
</form>
check.jsp:
<%
//解決亂碼
request.setCharacterEncoding("UTF-8");
//步驟一:獲取用戶在頁面輸入的數據
String username=request.getParameter("username");
String password=request.getParameter("password");
//步驟二:校驗用戶名和密碼
if((username!=""&&username!=null)&&(password!=""&&password!=null)){
if(username.equals("admin")&&password.equals("admin")){
//第一件事情:保存用戶信息(可以用request對象也可以用session對象)
request.getSession().setAttribute("username", username);
//第二件事情:跳轉頁面(使用轉發或者重定向)
//轉發:同一次請求,在服務器內部進行,轉發可以攜帶數據
request.getRequestDispatcher("welcome.jsp").forward(request, response);
//重定向:不同請求,在客戶端執行,而且不能攜帶數據,需要制定全路徑
//response.sendRedirect("/WebProject_Chap02/login/welcome.jsp");
}else{
System.out.println("登陸失敗~");
response.sendRedirect("/WebProject_Chap02/login/login.jsp");
}
}else{
out.println("<script type='text/javascript'>");
out.println("alert('請輸入用戶名或者密碼')");
out.println("location.href='http://localhost:8080/WebProject_Chap02/login/login.jsp'");
out.println("</script>");
}
%>
welcome.jsp:
歡迎登陸:${username }
四.session會話對象
會話是客戶端與服務器建立的一次連接,會話有對應的過期時間,一旦會話過期或者關閉,那么存放再回話當中的數據將會自動釋放
//設置session的失效時間
//session.setMaxInactiveInterval(5);
//獲取會話ID,不同瀏覽器會話是不同的
out.print(session.getId());
//向session當中存放數據:一般用於存放用戶的登陸信息
session.setAttribute("sessionKey", "張三");
//獲取session中數據
Object value=session.getAttribute("sessionKey");
//刪除session會話中的數據:當用戶退出系統時,我們利用session的remove方法刪除數據
session.removeAttribute("sessionKey");
session登陸攔截:在要攔截的頁面中加入如下代碼(思想為:登陸成功會往session存放用戶數據,我們去頁面中判斷是否有用戶數據就可以)
<%
//步驟一:先獲取session對象中保存的userName值
Object value=session.getAttribute("username");
//步驟二:判斷value是否為空
if(value==null){
response.sendRedirect("/WebProject_Chap02/login/login.jsp");
}
%>
五.include指令:用於頁面嵌套(將公共內容放到頁面當中,然后通過指令引入頁面)
sessionCheck.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//步驟一:先獲取session對象中保存的userName值
Object value=session.getAttribute("username");
//步驟二:判斷value是否為空
if(value==null){
response.sendRedirect("/WebProject_Chap02/login/login.jsp");
}
%>
其他頁面引入,在page指令下方
<%@ include file="sessionCheck.jsp" %>
六.application對象
<%
//返回相對路徑的真實路徑
//out.print(application.getRealPath("application.jsp"));
//獲取當前的網站訪問次數
Integer count = (Integer)application.getAttribute("count");
//當前訪問為第一次時
if(count==null){
count=1;
}else{
count++;
}
//更改完訪問次數后添加到application對象當中
application.setAttribute("count", count);
%>
<%="當前您是第"+application.getAttribute("count")+"訪問的網站~" %>
七.作用域
jsp4大作用域,從小到大為:
1.page:當前頁面有效
2.request:同一次請求有效
3.session:同一個會話有效
4.application:同一個應用有效
八.cookie
1.cookie和session區別
1.1 cookie不是內置對象,session是
1.2 session是在服務器內部存放信息的,而cookie由服務器創建,但是數據保存到客戶端
1.3 session保存的數據為Object類型,而cookie保存的是字符串
1.4 session由會話結束而失效,但是cookie是長期保存到客戶端的
1.5 session對比cookie安全一些
2.cookie案例:保存用戶名信息
login.jsp代碼:
<%
String username="";
//獲取cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
//先看當前cookie當中有沒有存放的name值
if(cookies[i].getName().equals("username")){
//獲取value
username=cookies[i].getValue();
}
}
}
%>
<form action="<%=basePath %>/cookie/check.jsp" method="post">
用戶名:<input type="text" name="username" value="<%=username%>"/><br/>
密碼:<input type="password" name="password"/><br/>
<input type="submit" value="提交"/> <input type="reset" value="重置"/>
</form>
check.jsp頁面代碼:
<%
//解決亂碼
request.setCharacterEncoding("UTF-8");
//步驟一:獲取用戶在頁面輸入的數據
String username=request.getParameter("username");
String password=request.getParameter("password");
//步驟二:校驗用戶名和密碼
if((username!=""&&username!=null)&&(password!=""&&password!=null)){
if(username.equals("admin")&&password.equals("admin")){
//第一件事情:保存用戶信息(可以用request對象也可以用session對象)
request.getSession().setAttribute("username", username);
//用Cookie存放數據
Cookie cookie=new Cookie("username",username);
//利用response對象將cookie保存到客戶端
response.addCookie(cookie);
//第二件事情:跳轉頁面(使用轉發或者重定向)
//轉發:同一次請求,在服務器內部進行,轉發可以攜帶數據
request.getRequestDispatcher("welcome.jsp").forward(request, response);
//重定向:不同請求,在客戶端執行,而且不能攜帶數據,需要制定全路徑
//response.sendRedirect("/WebProject_Chap02/login/welcome.jsp");
}else{
System.out.println("登陸失敗~");
response.sendRedirect("/WebProject_Chap02/cookie/login.jsp");
}
}else{
out.println("<script type='text/javascript'>");
out.println("alert('請輸入用戶名或者密碼')");
out.println("location.href='http://localhost:8080/WebProject_Chap02/cookie/login.jsp'");
out.println("</script>");
}
%>
第四章:Servlet
一.什么是Servlet?
Servlet是一個自定義的類,暴露給客戶端一個訪問地址,可以實現跟用戶交互
二.Servlet的3種創建方式
方法一:新建一個類,實現Servlet接口
@WebServlet(urlPatterns= {"/FirstServlet"},loadOnStartup=1)
public class FirstServlet implements Servlet{
/**
* 初始化Servlet
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("========================Servlet初始化工作完成~");
}
/**
* 獲取Servlet配置
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 處理用戶請求的方法
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//接受用戶攜帶的參數數據
String parameter = req.getParameter("address");
System.out.println("==========================處理用戶請求~\t"+parameter);
}
/**
* 獲取Servlet信息
*/
@Override
public String getServletInfo() {
return null;
}
/**
* Servlet銷毀方法
*/
@Override
public void destroy() {
System.out.println("==========================Servlet銷毀~");
}
}
方法二:新建一個類,繼承GenericServlet
@WebServlet("/SecondServlet")
public class SecondServlet extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("GenericServlet方法二的請求方法service");
}
}
方法三:新建一個類,繼承HttpServlet(手動重寫doGet和doPost)
@WebServlet("/ThreadServlet")
public class ThreadServlet extends HttpServlet{
/**
* doGet專門處理HTTP Get請求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Get和Post請求都能執行");
}
}
三.Servlet配置訪問地址
方式一:基於web.xml
<!-- 配置Servlet -->
<servlet>
<servlet-name>FouthServlet</servlet-name> <!--名稱:建議和類名相同-->
<servlet-class>com.wdksoft.servlet.FouthServlet</servlet-class> <!--地址-->
</servlet>
<servlet-mapping>
<servlet-name>FouthServlet</servlet-name> <!--名稱:與上面servlet節點的servlet-name相同-->
<url-pattern>/FouthServlet</url-pattern> <!--訪問地址:不要忘記加/-->
</servlet-mapping>
方式二:基於注解
在類上加入@WebServlet("/FouthServlet")注解,括號內一個參數時直接傳入地址,不要忘記加/
四.Servlet初始化時機
默認初始化時機為客戶端請求時執行init方法,可以根據loadOnStartUp屬性(默認為-1)控制
更改初始化時機:
<servlet>
<servlet-name>FouthServlet</servlet-name>
<servlet-class>com.wdksoft.servlet.FouthServlet</servlet-class>
<!-- 初始化時機:值越大,越先加載 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FouthServlet</servlet-name>
<url-pattern>/FouthServlet</url-pattern>
</servlet-mapping>
注解方式:
@WebServlet(urlPatterns= {"/FirstServlet"},loadOnStartup=1)
五.Servlet生命周期
1.由Servlet容器進行創建實例
2.初始化
3.執行處理請求方法
4.銷毀
客戶端發送請求時,Servlet容器會創建對應Servlet實例,然后執行init初始化方法,然后執行service處理請求方法,最終Servlet容器釋放會調度Servlet的destroy方法
六.JSP和Servlet交互(模擬登陸退出)
login.jsp頁面
<form action="UserServlet?action=login" method="post">
用戶名:<input type="text" name="username"/>
密碼:<input type="password" name="password"/>
<input type="submit" value="提交"/><input type="reset" value="重置"/>
</form>
UserSerlvet代碼:
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
// 序列化標識ID
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 區分不同功能
String action = request.getParameter("action");
if (action != null) {
if (action.equals("login")) {
// 獲取到用戶提交的數據
String username = request.getParameter("username");
String password = request.getParameter("password");
// 判斷用戶名和密碼是否正確
if (username.equals("admin") && password.equals("admin")) {
// 保存用戶信息
request.getSession().setAttribute("user", username);
// 跳轉到Welcome.jsp頁面
response.sendRedirect("/WebProject_Chap03/welcome.jsp");
} else {
// 解決服務器向客戶端發送信息亂碼
response.setContentType("text/html;charset=utf-8");
// 提示:用響應對象構建提示頁面
response.getWriter().write("<script type='text/javascript'>");
response.getWriter().write("alert('請輸入用戶名或者密碼');");
response.getWriter().write("location.href='/WebProject_Chap03/login.jsp'");
response.getWriter().write("</script>");
}
} else if (action.equals("logOut")) {
// 清除session數據
request.getSession().removeAttribute("user");
response.sendRedirect("/WebProject_Chap03/login.jsp");
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
welcome.jsp頁面代碼
歡迎登陸:${user } <a href="UserServlet?action=logOut">退出</a>
七.初始化參數
局部Servlet:利用ServletConfig接口
web.xml文件配置
<!-- 配置Servlet -->
<servlet>
<servlet-name>FouthServlet</servlet-name>
<servlet-class>com.wdksoft.servlet.FouthServlet</servlet-class>
<!-- 配置初始化參數 -->
<init-param>
<param-name>init</param-name>
<param-value>initValue</param-value>
</init-param>
<init-param>
<param-name>init2</param-name>
<param-value>initValue2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FouthServlet</servlet-name>
<url-pattern>/FouthServlet</url-pattern>
</servlet-mapping>
Servlet內獲取:
String initValue = getInitParameter("init");
System.out.println("ServletConfig:"+initValue);
全局:所有Servlet共享:
web.xml文件配置
<context-param>
<param-name>context</param-name>
<param-value>contextValue</param-value>
</context-param>
獲取:
//獲取全局初始化參數
String context = getServletContext().getInitParameter("context2");
System.out.println("ServletContext:"+context);
第五章:Dao模式
一.數據持久化:數據從瞬時狀態到持久狀態的改變
二.DAO模式
軟開當中:分層概念
1.實體層:Entity(一個類對應的一個數據庫表) Grade:GradeId GradeName
2.數據訪問層:Dao層(數據訪問:將數據庫的數據取出來保存到Entity當中,同樣將Entity中的數據保存數據庫)
3.業務邏輯層:Service層(書寫業務邏輯的)
4.UI層:Servlet 跟用戶進行交互的
傳統開發:代碼冗余,代碼耦合
//步驟一:加載驅動
Class.forName("com.mysql.jdbc.Driver");
//步驟二:獲取連接
Connection con=DriverManager.getConnection("jdbc:mysql:///myschool","root","root");
//步驟三:准備一條SQL
String sql="select * from student where studentName=? and StudentNo=?";
//步驟四:獲取PreparedStatment對象
PreparedStatment ps=con.preparedStatement(sql);
ps.setObject.setObject
//步驟五:執行SQL
ResultSet rs=ps.executeQuery();
//步驟六:處理數據
if(rs!=null){
while(rs.next()){
String name=rs.getxxx(COLUNM);
String sex=rs.getxxx();
}
}
//最后回收資源
insert into Student(xxxxxxxx) values(?,?,?,?,?)
三.Dao模式環境搭建
BaseDao工具類
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
// 步驟一:創建數據庫4大連接參數
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/myschool?useUniCode=true&characterEncoding=utf-8";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
// 封裝一個獲取連接的方法
public void getConnection() throws Exception {
// 加載驅動
Class.forName(DRIVER);
// 獲取連接
if (conn == null) {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
}
// 增刪改方法
public int executeUpdate(String sql, Object... objs) throws Exception {
// 獲取連接
getConnection();
// 獲取PreparedStatement對象
ps = conn.prepareStatement(sql);
// 循環給?賦值
for (int i = 1; i <= objs.length; i++) {
ps.setObject(i, objs[i - 1]);
}
// 執行SQL
int count = ps.executeUpdate();
return count;
}
// 查詢
public ResultSet executeQuery(String sql, Object... objs) throws Exception {
// 獲取連接
getConnection();
// 獲取PreparedStatement對象
ps = conn.prepareStatement(sql);
// 循環給?賦值
for (int i = 1; i <= objs.length; i++) {
ps.setObject(i, objs[i - 1]);
}
// 執行SQL
rs = ps.executeQuery();
return rs;
}
// 關閉資源
public void closeResource() throws Exception {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
Entity實體:
import java.io.Serializable;
import java.util.Date;
public class Student implements Serializable{
/**
* 序列化標識ID
*/
private static final long serialVersionUID = 8000378773322768639L;
private Integer studentNo;
private String loginPwd;
private String studentName;
private Integer sex;
private Integer gradeId;
private String phone;
private String address;
private Date bornDate;
private String email;
private String identityCard;
public Integer getStudentNo() {
return studentNo;
}
public void setStudentNo(Integer studentNo) {
this.studentNo = studentNo;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getGradeId() {
return gradeId;
}
public void setGradeId(Integer gradeId) {
this.gradeId = gradeId;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getBornDate() {
return bornDate;
}
public void setBornDate(Date bornDate) {
this.bornDate = bornDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getIdentityCard() {
return identityCard;
}
public void setIdentityCard(String identityCard) {
this.identityCard = identityCard;
}
@Override
public String toString() {
return "Student [studentNo=" + studentNo + ", loginPwd=" + loginPwd + ", studentName=" + studentName + ", sex="
+ sex + ", gradeId=" + gradeId + ", phone=" + phone + ", address=" + address + ", bornDate=" + bornDate
+ ", email=" + email + ", identityCard=" + identityCard + "]";
}
public Student(Integer studentNo, String loginPwd, String studentName, Integer sex, Integer gradeId, String phone,
String address, Date bornDate, String email, String identityCard) {
this.studentNo = studentNo;
this.loginPwd = loginPwd;
this.studentName = studentName;
this.sex = sex;
this.gradeId = gradeId;
this.phone = phone;
this.address = address;
this.bornDate = bornDate;
this.email = email;
this.identityCard = identityCard;
}
public Student() {
}
}
Dao層接口
public interface IStudentDao {
//添加數據
public int insertStudent(Student student) throws Exception;
//修改數據
public int updateStudent(Student student) throws Exception;
//刪除數據
public int deleteStudent(Integer studentNo) throws Exception;
//查詢單條數據
public Student findOneStudent(Integer studentNo) throws Exception;
//查詢多條
public List<Student> findAllStudent() throws Exception;
}
DaoImpl實現類
public class IStudentDaoImpl extends BaseDao implements IStudentDao {
@Override
public int insertStudent(Student student) throws Exception {
//創建SQL語句
String sql="insert into Student(StudentNo,LoginPwd,StudentName,Sex,GradeId,Phone,Address,BornDate,Email,IdentityCard) Values(?,?,?,?,?,?,?,?,?,?)";
Object [] objects= {student.getStudentNo(),student.getLoginPwd(),student.getStudentName(),student.getSex(),student.getGradeId(),student.getPhone(),student.getAddress(),student.getBornDate(),student.getEmail(),student.getIdentityCard()};
int count = executeUpdate(sql, objects);
return count;
}
@Override
public int updateStudent(Student student) throws Exception {
String sql="update Student set StudentName=? where StudentNo=?";
int count = executeUpdate(sql, student.getStudentName(),student.getStudentNo());
return count;
}
@Override
public int deleteStudent(Integer studentNo) throws Exception {
String sql="delete from student where StudentNo=?";
return executeUpdate(sql, studentNo);
}
@Override
public Student findOneStudent(Integer studentNo) throws Exception {
Student student=new Student();
String sql="select * from student where StudentNo=?";
ResultSet rs = executeQuery(sql, studentNo);
if(rs!=null) {
while (rs.next()) {
student.setStudentNo(rs.getInt("studentNo"));
student.setLoginPwd(rs.getString("loginPwd"));
student.setStudentName(rs.getString("studentName"));
student.setSex(rs.getInt("sex"));
student.setGradeId(rs.getInt("gradeId"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setBornDate(rs.getDate("BornDate"));
student.setEmail(rs.getString("email"));
student.setIdentityCard(rs.getString("identityCard"));
}
}
return student;
}
@Override
public List<Student> findAllStudent() throws Exception {
List<Student> stuList=new ArrayList<>();
String sql="select * from student";
ResultSet rs = executeQuery(sql);
if(rs!=null) {
while (rs.next()) {
Student student=new Student();
student.setStudentNo(rs.getInt("studentNo"));
student.setLoginPwd(rs.getString("loginPwd"));
student.setStudentName(rs.getString("studentName"));
student.setSex(rs.getInt("sex"));
student.setGradeId(rs.getInt("gradeId"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setBornDate(rs.getDate("BornDate"));
student.setEmail(rs.getString("email"));
student.setIdentityCard(rs.getString("identityCard"));
stuList.add(student);
}
}
return stuList;
}
}
調用測試:
public static void main(String[] args) throws Exception {
//創建Dao層對象
IStudentDao iStudentDao=new IStudentDaoImpl();
String date="1999-8-5";
//將字符串轉換為日期類型
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date bornDate = simpleDateFormat.parse(date);
/*int insertCount = iStudentDao.insertStudent(new Student(1020, "123", "徐士康", 1, 1, "120120120120", "北京", bornDate, "123@qq.com", "123456789987456213"));
System.out.println("添加結果:"+insertCount);*/
System.out.println("===============================修改=======================================================");
Student student=new Student();
student.setStudentName("余博");
student.setStudentNo(1020);
int updateCount = iStudentDao.updateStudent(student);
System.out.println("修改結果:"+updateCount);
System.out.println("===============================刪除=======================================================");
int deleteCount = iStudentDao.deleteStudent(1020);
System.out.println("刪除結果:"+deleteCount);
System.out.println("===============================單條查詢=======================================================");
Student oneStudent = iStudentDao.findOneStudent(1000);
System.out.println(oneStudent.toString());
System.out.println("===============================多條查詢=======================================================");
List<Student> stuList = iStudentDao.findAllStudent();
for (Student stuItem : stuList) {
System.out.println(stuItem.toString());
}
}
第六章:JNDI和連接池
一.JNDI:Java naming and Directory Interface java命名和目錄接口,通過名稱來定位資源,可以實現資源共享,達到松耦合效果
JNDI案例:配置Tomcat文件,達到資源共享效果
在Tomcat中的context.xml文件中配置JNDI
<!-- 配置JNDI name屬性對應資源名稱 value對應資源 type對應資源的數據類型-->
<Environment name="jndiResource" value="T26" type="java.lang.String"/>
獲取JNDI資源
<%
//獲取Context上下文對象
Context ctx=new InitialContext();
//定位JNDI資源
String jndiValue=(String)ctx.lookup("java:comp/env/jndiResource");
out.print(jndiValue);
%>
二.連接池
傳統連接數據庫時,需要創建連接對象,連接池是幫我們管理和維護連接對象
使用連接池:
1.將數據庫驅動jar放到tomcat中lib文件夾下
2.配置Tomcat配置文件context.xml
<!-- 連接池 -->
<Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="root"
password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/newsmanagersystem?
useUnicode=true&characterEncoding=utf-8" />
3.使用連接池(更改BaseDao)
public void getConnection() throws Exception {
//創建上下文對象
Context context=new InitialContext();
//獲取連接池對象
DataSource dataSource=(DataSource)context.lookup("java:comp/env/jdbc/news");
//獲取連接
conn=dataSource.getConnection();
}
第七章:文件上傳
文件上傳組件:commons-fileupload組件
文件上傳步驟:
一.在項目中添加支持文件上傳的依賴
commons-fileupload.jar
commons-io.jar
二.創建文件上傳表單頁面(提交方式必須post,必須加入enctype屬性,文件元素必須包含name,否則后台拿不到文件)
<form action="" method="post" enctype="multipart/form-data">
作者:<input type="text" name="author"/>
簡介:<input type="text" name="summary"/>
<input type="file" name="file"/>
<input type="submit" value="上傳"/>
</form>
三.編寫處理文件上傳代碼
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判斷當前提交的form表單是否是文件上傳表單
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
//如果當前是文件上傳表單則拿到所有提交的數據
if(isMultipart) {
FileItemFactory fileItemFactory=new DiskFileItemFactory();
//創建ServletFileUpload對象
ServletFileUpload fileUpload=new ServletFileUpload(fileItemFactory);
fileUpload.setHeaderEncoding("UTF-8");
//獲取提交的所有數據
try {
//每一個FileItem代表了每一個表單提交的數據
List<FileItem> fileItemList = fileUpload.parseRequest(req);
/*System.out.println("當前表單提交數據個數:"+fileItemList.size());*/
//循環拿到表單上傳每一個元素
for (FileItem fileItem : fileItemList) {
//判斷當前元素是普通的還是文件數據
if(fileItem.isFormField()) {
//判斷普通表單元素的name值
if(fileItem.getFieldName().equals("author")) {
//獲取當前普通表單元素的值
System.out.println("作者:"+fileItem.getString("UTF-8"));
}else if(fileItem.getFieldName().equals("summary")) {
System.out.println("內容:"+fileItem.getString("UTF-8"));
}
}else {
//判斷文件大小
if(fileItem.getSize()<=2048000) {
//獲取文件名字
String fileName=fileItem.getName();
//判斷文件上傳格式
int lastIndex = fileName.lastIndexOf(".");
//截取
String suffix = fileName.substring(lastIndex+1);
if(suffix.equals("jpg")||suffix.equals("gif")||suffix.equals("png")) {
//獲取文件上傳路徑
String path=getServletContext().getRealPath("upload");
System.out.println(path);
//上傳
File file=new File(path,fileName);
try {
//將內存中的文件寫入到服務器
fileItem.write(file);
} catch (Exception e) {
e.printStackTrace();
}
}else {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("文件上傳格式不正確");
}
}else {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("文件太大,無法上傳~");
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
第八章:EL和JSTL
一.EL表達式:簡化JSP頁面中數據訪問的大量Java代碼,自動轉換類型,使用起來比較簡單,語法${xxxx}
1.EL獲取變量的值
Servlet后台:
String name="張三";
req.setAttribute("variable", name);
req.getSession().setAttribute("variable", "李四");
req.getRequestDispatcher("/index.jsp").forward(req, resp);
JSP頁面:
EL表達式獲取變量的值:${requestScope.variable }
2.EL表達式獲取數據的作用域問題
默認情況下會根據page--request--session--application找到即返回,如果沒有找到返回的是Null
可以指定作用域取值,如${xxxScope.xxx}
3.EL獲取對象中的值
Users users=new Users();
users.setUser_id(1);
users.setUser_name("張三");
req.setAttribute("obj", users);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
EL表達式獲取對象值:${obj.user_name }
4.EL表達式獲取List集合的值
List<Users> userList=new ArrayList<>();
Users users1=new Users();
users1.setUser_id(1);
users1.setUser_name("張三");
userList.add(users1);
Users users2=new Users();
users2.setUser_id(2);
users2.setUser_name("李四");
userList.add(users2);
req.setAttribute("userList", userList);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
EL表達式獲取List集合值:${userList[1].user_name }
5.EL表達式獲取Map集合的值
Users users1=new Users();
users1.setUser_id(1);
users1.setUser_name("張三");
Users users2=new Users();
users2.setUser_id(2);
users2.setUser_name("李四");
Map<String, Users> userMap=new HashMap<>();
userMap.put("user1", users1);
userMap.put("user2", users2);
req.setAttribute("userMap", userMap);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
EL表達式獲取Map值:${userMap["user2"].user_name }
二.JSTL表達式:JSP標准標簽庫(JSP Standard Tag Library),提供一組標准標簽,幫助實現JSP動態業務邏輯
1.使用JSTL方式
步驟一:在工程中加入jstl-xxx.jar
步驟二:在頁面中使用taglib指令導入(uri屬性代表地址,導入的是http://java.sun.com/jsp/jstl/core prefix屬性代表前綴,可任意,推薦c)
JSP三大指令:page incloud taglib
2.JSTL通用標簽
<!-- set標簽給變量賦值 var代表變量名 value代表變量值 scope代表作用域-->
<c:set var="name" value="張三" scope="session"/>
${name }
<!-- set標簽給對象屬性賦值 target代表目標對象 property代表屬性 value代表給屬性的值-->
<%
Users users=new Users();
request.setAttribute("users", users);
%>
<%-- <c:set target="${users }" property="user_name" value="李四"/> --%>
<hr/>
<!-- out標簽用於計算值並且輸出到頁面上 value代表頁面輸出的內容 default代表如果輸出內容為null,可以給默認值-->
<c:out value="呵呵,low"/>
<c:out value="${users.user_name }" default="王五"/>
<!-- out標簽轉義 -->
<c:out escapeXml="false" value="<a href='http://www.baidu.com'>百度</a>"/>
<hr/>
<!-- remove標簽刪除數據 var代表變量名 scope作用域-->
<c:remove var="name" scope="session"/>
3.JSTL條件標簽
<!-- c:if 屬性test代表表達式返回true或者false var屬性代表返回值結果 scope保存值得作用域 -->
<c:if test="${'admin' eq 'admin' }" var="flag" scope="page">
${flag }
</c:if>
<hr/>
<c:choose>
<c:when test="${1==2 }">
第一個when
</c:when>
<c:when test="${1==2 }">
第二個when
</c:when>
<c:otherwise>
其他情況
</c:otherwise>
</c:choose>
4.JSTL遍歷迭代標簽
<!-- items代表要遍歷的集合 var代表集合中的每一項 step代表步長 begin代表開始位置 end代表結束位置 varStatus每一項數據的引用 -->
<c:forEach items="${userList }" var="item" step="2" varStatus="i">
${item.user_name }
</c:forEach>
<!-- forEach遍歷map -->
<c:forEach items="${userMap }" var="mapItem">
${mapItem.value.user_name }
</c:forEach>
第九章:Ajax
一.同步和異步
同步請求,客戶端向服務器發送請求,服務器響應整合頁面
異步請求,客戶端發送請求,服務器響應對應數據
二.JavaScripte原生態Ajax
//原生態Ajax請求的核心對象XMLHttpRequest
var xhr=null;
if(window.XMLHttpRequest){
//IE7+
xhr=new XMLHttpRequest();
}else{
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
//構建一個異步請求
xhr.open("POST","AjaxServlet",true);
//設置請求頭
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//發送請求
xhr.send("name="+username.value);
//接受響應
xhr.onreadystatechange=function(){
//服務器響應結束並且是正常響應
if(xhr.readyState==4&&xhr.status==200){
//獲取響應回來的數據Text
if(xhr.responseText=="false"){
document.getElementById("message").innerText="不能注冊~";
}else{
document.getElementById("message").innerText="可以注冊~";
}
}
}
三.Jquery提供的Ajax解決方案
//用Jquery提供的$.ajax發送請求
$.ajax({
url:"AjaxServlet", //請求發送地址
type:"POST", //請求方式,默認為Get
data:{name:$("#username").val()}, //傳遞給服務器的數據,推薦JSON
dataType:"text", //解析數據類型,必須確切匹配
success:function(result){ //成功響應回調函數 result代表服務器響應的數據
if(result=="false"){
$("#message").text("不能注冊~");
}else{
$("#message").text("可以注冊~");
}
},
error:function(){ //異常回調
alert("服務器響應錯誤,請稍后重試");
}
});
四.Json
Json數據格式:JavaScript Object notation
Json格式字符串:{key:value,key2:value2}
JSON格式數組:
//定義Json格式數組
var jsonArray = [ {
"name" : "張三",
"address" : "北京"
}, {
"name" : "李四",
"address" : "上海"
}, {
"name" : "王五",
"address" : "河南"
}, {
"name" : "趙六",
"address" : "內蒙古"
} ];
JSON獲取數據和遍歷
//遍歷數組
$.each(jsonArray,function(i,item){
alert(item.name);
})
五.fastJson
一.導入Jar包
二.將Java對象轉換為json格式數組
String userStr = JSON.toJSONString(user);
三.將JSON字符串反序列化為對象
Users parseObject = JSON.parseObject(userStr, Users.class);
新聞發布系統:
第一天:環境搭建
一.驅動jar的加載
將jar包copy到web-inf下的lib文件夾,自動導包
二.登陸功能
1.創建實體
/**
* 承載用戶信息的實體
* @author FLC
*
*/
public class News_Users implements Serializable{
/**
* 序列化ID
*/
private static final long serialVersionUID = -4385525238332285976L;
private Integer uid; //用戶編號
private String uname; //用戶名稱
private String upwd; //登陸密碼
private String telephone; //手機號
private String email; //郵箱
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "News_Users [uid=" + uid + ", uname=" + uname + ", upwd=" + upwd + ", telephone=" + telephone
+ ", email=" + email + "]";
}
public News_Users(Integer uid, String uname, String upwd, String telephone, String email) {
this.uid = uid;
this.uname = uname;
this.upwd = upwd;
this.telephone = telephone;
this.email = email;
}
public News_Users() {
}
}
2.搭建Dao層接口,創建一個方法,用於登陸功能,方法實現過程如下:
拿到用戶名去數據庫匹配,如果成功則返回有數據的對象,如果失敗,返回null
/**
* 用戶接口
* @author FLC
*
*/
import com.news.entity.News_Users;
public interface INewsUsersDao {
//登陸方法
public News_Users userLogin(String uname) throws Exception;
}
3.搭建Dao層實現類,用於跟數據庫進行交互
/**
* 用戶接口實現類
*
* @author FLC
*
*/
public class INewsUsersDaoImpl extends BaseDao implements INewsUsersDao {
@Override
public News_Users userLogin(String uname) throws Exception {
// 創建用戶對象,並且返回
News_Users users = null;
// 准備一條SQL語句
String sql = "select * from news_users where uname=?";
// 執行SQL
ResultSet rs = executeQuery(sql, uname);
// 處理數據
if (rs != null) {
while (rs.next()) {
users=new News_Users();
users.setUid(rs.getInt("uid"));
users.setUname(rs.getString("uname"));
users.setUpwd(rs.getString("upwd"));
users.setTelephone(rs.getString("telephone"));
users.setEmail(rs.getString("email"));
}
}
return users;
}
}
4.service層接口,創建一個方法,用於校驗用戶名和密碼,實現思路如下:
先拿到Servlet傳遞的用戶名和密碼,先跟Dao層進行用戶名驗證,如果驗證有返回值結果,則再次驗證密碼,如果返回值為null,則直接返回NULL
/**
* 用戶業務邏輯層接口
* @author FLC
*
*/
import com.news.entity.News_Users;
public interface INewsUsersService {
//登錄業務方法定義
public News_Users userLogin(String uname,String upwd) throws Exception;
}
5.service層實現類:實現service層接口,重寫接口中方法,將上述的邏輯編碼到方法當中,實現功能
/**
* 用戶業務邏輯處理類
* @author FLC
*
*/
public class INewsUsersServiceImpl implements INewsUsersService{
//植入Dao層對象
private INewsUsersDao iNewsUsersDao=new INewsUsersDaoImpl();
@Override
public News_Users userLogin(String uname, String upwd) throws Exception {
//驗證用戶名和密碼
News_Users user = iNewsUsersDao.userLogin(uname);
if(user!=null) {
//驗證密碼
if(user.getUpwd().equals(upwd)) {
return user;
}
}
return null;
}
}
6.Servlet層,用於接收用戶輸入,傳遞給service做數據校驗,校驗完成則登陸成功,返回值為null則登陸失敗,登陸成功保存用戶信息,跳轉首頁
@WebServlet("/INewsUsersServlet")
public class INewsUsersServlet extends HttpServlet {
//創建Service層對象
private INewsUsersService iNewsUsersService=new INewsUsersServiceImpl();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取action參數值,用於區分不同功能
String action = request.getParameter("action");
if(action!=null) {
//判斷登錄功能
if(action.equals("login")) {
//接收用戶傳遞的用戶名和密碼
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
try {
//校驗用戶名密碼
News_Users user = iNewsUsersService.userLogin(username, userpwd);
if(user!=null) {
//保存用戶信息
request.getSession().setAttribute("user", user);
//跳轉頁面
response.sendRedirect("/NewsManager/index.jsp");
}else {
response.sendRedirect("/NewsManager/page/login/login.jsp");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.頁面,提供給用戶直觀效果,共用戶輸入和提交
<form class="layui-form" action="<%=basePath %>INewsUsersServlet?action=login" method="post" id="myform">
<div class="login_face"><img src="<%=basePath %>images/face.jpg" class="userAvatar"></div>
<div class="layui-form-item input-item">
<label for="userName">用戶名</label>
<input type="text" placeholder="請輸入用戶名" id="userName" name="username" class="layui-input">
</div>
<div class="layui-form-item input-item">
<label for="password">密碼</label>
<input type="password" placeholder="請輸入密碼" id="password" name="userpwd" class="layui-input" >
</div>
<div class="layui-form-item input-item" id="imgCode">
<label for="code">驗證碼</label>
<input type="text" placeholder="請輸入驗證碼" autocomplete="off" id="code" class="layui-input">
<img src="<%=basePath %>images/code.jpg">
</div>
<div class="layui-form-item">
<!-- <button class="layui-btn layui-block" lay-filter="login" lay-submit>登錄</button> -->
<input type="submit" class="layui-btn layui-block" value="登錄"/>
</div>
<div class="layui-form-item layui-row">
<a href="javascript:;" class="seraph icon-qq layui-col-xs4 layui-col-sm4 layui-col-md4 layui-col-lg4"></a>
<a href="javascript:;" class="seraph icon-wechat layui-col-xs4 layui-col-sm4 layui-col-md4 layui-col-lg4"></a>
<a href="javascript:;" class="seraph icon-sina layui-col-xs4 layui-col-sm4 layui-col-md4 layui-col-lg4"></a>
</div>
</form>
第二天:一.新聞列表:思路如下
1.首先用戶在頁面中點擊新聞請求,將請求發送到Servlet
找到json文件夾下的nav.json,修改href為Servlet地址
"title": "新聞列表",
"icon": "icon-text",
"href": "/NewsManager/INewsServlet?action=newsList",
"spread": false
2.構建Servlet實現和用戶數據的交互過程,servlet需要調用service拿到數據,然后將取到的數據保存到request作用域當中,然后轉發到頁面
@WebServlet("/INewsServlet")
public class INewsServlet extends HttpServlet{
//植入Service層對象
private INewsService iNewsService=new INewsServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action=req.getParameter("action");
if(action!=null) {
if(action.equals("newsList")) {
try {
List<News> newsList = iNewsService.getAllNews();
//保存集合數據
req.setAttribute("newsList", newsList);
//轉發
req.getRequestDispatcher("/page/news/newsList.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
3.構建Service層,提供給Servlet數據,數據來源於Dao層
Service層接口定義方法,用於查詢所有新聞
public interface INewsService {
// 查詢所有新聞數據
public List<News> getAllNews() throws Exception;
}
ServiceImpl實現類調用Dao層拿到數據
public class INewsServiceImpl implements INewsService{
//植入Dao層對象
private INewsDao iNewsDao=new INewsDaoImpl();
@Override
public List<News> getAllNews() throws Exception {
return iNewsDao.getAllNews();
}
}
4.構建Dao層,用於操作數據
Dao層接口定義方法,用於查詢所有新聞
public interface INewsDao {
// 查詢所有新聞數據
public List<News> getAllNews() throws Exception;
}
DaoImpl實現類訪問數據庫拿到數據
public class INewsDaoImpl extends BaseDao implements INewsDao{
@Override
public List<News> getAllNews() throws Exception {
List<News> newsList=new ArrayList<>();
//創建SQL語句
String sql="select * from news,topic where news.ntid=topic.tid";
//執行SQL
ResultSet rs = executeQuery(sql);
//將數據封裝到實體對象當中
if(rs!=null) {
while (rs.next()) {
News news=new News();
news.setNid(rs.getInt("nid"));
news.setNtitle(rs.getString("ntitle"));
news.setNtid(rs.getInt("ntid"));
news.setNauthor(rs.getString("nauthor"));
news.setNcontent(rs.getString("ncontent"));
news.setNpicPath(rs.getString("npicpath"));
news.setNcreateDate(rs.getDate("ncreateDate"));
news.setNmodifyDate(rs.getDate("nmodifyDate"));
news.setNsummary(rs.getString("nsummary"));
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
news.setTopic(topic);
newsList.add(news);
}
}
return newsList;
}
}
5.數據封裝到實體News Topic
6.渲染頁面
<table class="layui-table">
<thead>
<tr>
<th><input type="checkbox" name="allChecked" /></th>
<th>新聞編號</th>
<th>新聞標題</th>
<th>新聞類別</th>
<th>發布者</th>
<th>發布時間</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<%
List<News> newsList=(List<News>)request.getAttribute("newsList");
for(News news:newsList){
%>
<tr>
<th><input type="checkbox" name="allChecked" /></th>
<td><%=news.getNid() %></td>
<td><%=news.getNtitle() %></td>
<td><%=news.getTopic().getTname() %></td>
<td><%=news.getNauthor() %></td>
<td><%=news.getNcreateDate() %></td>
<td><a class="layui-btn layui-btn-xs" lay-event="edit">編輯</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">刪除</a>
<a class="layui-btn layui-btn-xs layui-btn-primary" lay-event="look">預覽</a></td>
</tr>
<%
}
%>
</tbody>
</table>
第三天:一.添加新聞
1.綁定添加新聞頁面的下拉框分類列表
1.1 新建Dao層接口,提供查詢所有新聞分類的方法
public interface ITopicDao {
//新聞添加頁面中的分類列表綁定
public List<Topic> getAllTopic() throws Exception;
}
1.2 創建Dao層接口的實現類,從數據庫查詢數據並保存
public class ITopicDaoImpl extends BaseDao implements ITopicDao {
@Override
public List<Topic> getAllTopic() throws Exception {
List<Topic> topicList=new ArrayList<>();
String sql="select * from topic";
ResultSet rs = executeQuery(sql);
if(rs!=null) {
while (rs.next()) {
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
topicList.add(topic);
}
}
return topicList;
}
}
1.3 新建Service層接口,方法與Dao層方法相同
public interface ITopicService {
//新聞添加頁面中的分類列表綁定
public List<Topic> getAllTopic() throws Exception;
}
1.4 創建Service層接口的實現類,重寫接口中的方法,調用Dao層方法,實現數據傳遞
public class ITopicServiceImpl implements ITopicService {
private ITopicDao iTopicDao=new ITopicDaoImpl();
@Override
public List<Topic> getAllTopic() throws Exception {
return iTopicDao.getAllTopic();
}
}
1.5 新建Servlet層,控制用戶發送請求的訪問,調度Service層獲取數據,保存到request作用域當中,轉發到newsAdd.jsp頁面上
@WebServlet("/ITopicServlet")
public class ITopicServlet extends HttpServlet {
private ITopicService iTopicService=new ITopicServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action=req.getParameter("action");
if(action!=null) {
if(action.equals("getTopicList")) {
try {
List<Topic> topicList = iTopicService.getAllTopic();
req.setAttribute("topicList", topicList);
req.getRequestDispatcher("/page/news/newsAdd.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
1.6 更改newsList.jsp頁面中添加文章的按鈕請求
<div class="layui-inline">
<a href="<%=basePath %>ITopicServlet?action=getTopicList" class="layui-btn layui-btn-normal">添加文章</a>
</div>
1.7 渲染newsAdd.jsp頁面的下拉框
<div class="border category">
<select name="ntid">
<option value="0">請選擇</option>
<%
List<Topic> topicList =(List<Topic>)request.getAttribute("topicList");
for(Topic topic:topicList){
%>
<option value="<%=topic.getTid() %>"><%=topic.getTname() %></option>
<%
}
%>
</select>
</div>
2.添加新聞
2.1添加新聞的頁面更改(1.監控form表單提交 2.給元素name屬性 3.更改提交按鈕)
<form class="layui-form layui-row layui-col-space10" id="myform" action="<%=basePath%>INewsServlet?action=insertNews" method="post">
<div class="layui-col-md9 layui-col-xs12">
<div class="layui-row layui-col-space10">
<div class="layui-col-md9 layui-col-xs7">
<div class="layui-form-item magt3">
<label class="layui-form-label">文章標題</label>
<div class="layui-input-block">
<input type="text" class="layui-input newsName" name="ntitle" lay-verify="newsName" placeholder="請輸入文章標題">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">內容摘要</label>
<div class="layui-input-block">
<textarea placeholder="請輸入內容摘要" lay-verify="nsummary" name="nsummary" class="layui-textarea abstract"></textarea>
</div>
</div>
</div>
<div class="layui-col-md3 layui-col-xs5">
<div class="layui-upload-list thumbBox mag0 magt3">
<img class="layui-upload-img thumbImg">
</div>
</div>
</div>
<div class="layui-form-item magb0">
<label class="layui-form-label">文章內容</label>
<div class="layui-input-block">
<textarea class="layui-textarea layui-hide" name="ncontent" lay-verify="content" id="news_content"></textarea>
</div>
</div>
</div>
<div class="layui-col-md3 layui-col-xs12">
<blockquote class="layui-elem-quote title"><i class="seraph icon-caidan"></i> 分類目錄</blockquote>
<div class="border category">
<select name="ntid">
<option value="0">請選擇</option>
<%
List<Topic> topicList =(List<Topic>)request.getAttribute("topicList");
for(Topic topic:topicList){
%>
<option value="<%=topic.getTid() %>"><%=topic.getTname() %></option>
<%
}
%>
</select>
</div>
<hr class="layui-bg-gray" />
<div class="layui-right">
<input type="submit" value="提交" class="layui-btn layui-btn-sm"/>
<!-- <a class="layui-btn layui-btn-sm" lay-filter="addNews" lay-submit><i class="layui-icon"></i>發布</a> -->
<a class="layui-btn layui-btn-primary layui-btn-sm" lay-filter="look" lay-submit>預覽</a>
</div>
</div>
</div>
</form>
2.2 獲取富文本編輯器的純文本內容(在newsAdd.js文件中監控表單提交,獲取純文本內容)
$("#myform").submit(function() {
//獲取富文本編輯器的純文本內容
var text=layedit.getText(editIndex);
//定位到新聞內容text
$("[name=ncontent]").val(text);
})
2.3 在INewsDao層中創建添加新聞的方法
public interface INewsDao {
//查詢所有新聞數據
public List<News> getAllNews() throws Exception;
//添加新聞
public int insertNews(News news) throws Exception;
}
2.4 在INewsDaoImpl實現類中重寫方法,實現數據添加
@Override
public int insertNews(News news) throws Exception {
//准備一條SQL語句
String sql="insert into news(ntid,ntitle,nauthor,ncreateDate,ncontent,nmodifyDate,nsummary) values(?,?,?,?,?,?,?)";
Object [] objs= {news.getNtid(),news.getNtitle(),news.getNauthor(),news.getNcreateDate(),news.getNcontent(),news.getNmodifyDate(),news.getNsummary()};
return executeUpdate(sql, objs);
}
2.5 在INewsService接口中創建和Dao層同樣的方式,實現數據傳遞
public interface INewsService {
// 查詢所有新聞數據
public List<News> getAllNews() throws Exception;
// 添加新聞
public int insertNews(News news) throws Exception;
}
2.6 在INewsServiceImpl實現類中重寫方法,調度Dao層
@Override
public int insertNews(News news) throws Exception {
return iNewsDao.insertNews(news);
}
2.7 編寫INewsServlet,區分功能,實現接受頁面輸入,封裝數據,傳遞給service層,判斷返回值,是否添加成功~
else if(action.equals("insertNews")) {
//將數據封裝到News對象當中
News news=new News();
news.setNtitle(req.getParameter("ntitle"));
news.setNsummary(req.getParameter("nsummary"));
news.setNcontent(req.getParameter("ncontent"));
news.setNtid(Integer.parseInt(req.getParameter("ntid")));
news.setNcreateDate(new Date());
news.setNmodifyDate(new Date());
//作者是登陸成功之后保存到Session中的數據
News_Users user = (News_Users)req.getSession().getAttribute("user");
news.setNauthor(user.getUname());
try {
int count = iNewsService.insertNews(news);
if(count>0) {
//重新查詢數據庫數據
req.getRequestDispatcher("/INewsServlet?action=newsList").forward(req, resp);
}else {
req.getRequestDispatcher("/INewsServlet?action=newsList").forward(req, resp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
第四天:帶條件查詢加分頁
1.將頁面中所有用到分頁的零散數據封裝到pageUtil當中
public class PageUtil<T> {
// 當前頁碼
private Integer pageIndex;
// 每頁顯示的記錄數
private Integer pageSize;
// 總記錄數
private Integer pageTotalCount;
// 總頁數
private Integer pageTotalNumbers;
//頁面顯示的集合數據
private List<T> pageList;
public Integer getPageIndex() {
return pageIndex;
}
public void setPageIndex(Integer pageIndex) {
if(pageIndex<=0) {
pageIndex=1;
}else if(pageIndex>getPageTotalNumbers()) {
pageIndex=getPageTotalNumbers();
}
this.pageIndex = pageIndex;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPageTotalCount() {
return pageTotalCount;
}
public void setPageTotalCount(Integer pageTotalCount) {
this.pageTotalCount = pageTotalCount;
}
public Integer getPageTotalNumbers() {
pageTotalNumbers=this.getPageTotalCount()%this.getPageSize()==0 ? this.getPageTotalCount()/this.getPageSize() : this.getPageTotalCount()/this.getPageSize()+1;
return pageTotalNumbers;
}
public List<T> getPageList() {
return pageList;
}
public void setPageList(List<T> pageList) {
this.pageList = pageList;
}
}
2.在INewsDao中創建兩個方法,一個用於待條件查詢分頁的列表數據,第二個用於待條件查詢所有記錄數
public interface INewsDao {
//查詢所有新聞數據
public List<News> getAllNews() throws Exception;
//添加新聞
public int insertNews(News news) throws Exception;
//分頁查詢新聞數據
public List<News> getPageNewsList(int pageIndex,int pageSize,String ntitle) throws Exception;
//查詢總記錄數
public int getPageCount(String ntitle) throws Exception;
}
3.在INewsDaoImpl實現類中重寫方法,實現數據查詢,利用StringBuffer對象動態拼接SQL
@Override
public List<News> getPageNewsList(int pageIndex, int pageSize,String ntitle) throws Exception {
List<News> newsList=new ArrayList<>();
StringBuffer sBuffer=new StringBuffer("select * from news,topic where news.ntid=topic.tid ");
if(ntitle!=null) {
sBuffer.append(" and ntitle like '%"+ntitle+"%' ");
}
sBuffer.append(" order by nCreateDate desc limit ?,? ");
//執行SQL
ResultSet rs = executeQuery(sBuffer.toString(),(pageIndex-1)*pageSize,pageSize);
//將數據封裝到實體對象當中
if(rs!=null) {
while (rs.next()) {
News news=new News();
news.setNid(rs.getInt("nid"));
news.setNtitle(rs.getString("ntitle"));
news.setNtid(rs.getInt("ntid"));
news.setNauthor(rs.getString("nauthor"));
news.setNcontent(rs.getString("ncontent"));
news.setNpicPath(rs.getString("npicpath"));
news.setNcreateDate(rs.getDate("ncreateDate"));
news.setNmodifyDate(rs.getDate("nmodifyDate"));
news.setNsummary(rs.getString("nsummary"));
Topic topic=new Topic();
topic.setTid(rs.getInt("tid"));
topic.setTname(rs.getString("tname"));
news.setTopic(topic);
newsList.add(news);
}
}
return newsList;
}
@Override
public int getPageCount(String ntitle) throws Exception {
//總記錄數
int count=0;
StringBuffer sBuffer=new StringBuffer("select count(*) as count from news where 1=1");
if(ntitle!=null) {
sBuffer.append(" and ntitle like '%"+ntitle+"%' ");
}
ResultSet rs = executeQuery(sBuffer.toString());
if(rs.next()) {
count=rs.getInt("count");
}
return count;
}
4.在INewsService接口中添加與Dao層相同的方法
public interface INewsService {
// 查詢所有新聞數據
public List<News> getAllNews() throws Exception;
// 添加新聞
public int insertNews(News news) throws Exception;
// 分頁查詢新聞數據
public List<News> getPageNewsList(int pageIndex, int pageSize, String ntitle) throws Exception;
// 查詢總記錄數
public int getPageCount(String ntitle) throws Exception;
}
5.在INewsServiceImpl實現類中重寫方法,調度Dao層
public class INewsServiceImpl implements INewsService{
//植入Dao層對象
private INewsDao iNewsDao=new INewsDaoImpl();
@Override
public List<News> getAllNews() throws Exception {
return iNewsDao.getAllNews();
}
@Override
public int insertNews(News news) throws Exception {
return iNewsDao.insertNews(news);
}
@Override
public List<News> getPageNewsList(int pageIndex, int pageSize,String ntitle) throws Exception {
return iNewsDao.getPageNewsList(pageIndex, pageSize,ntitle);
}
@Override
public int getPageCount(String ntitle) throws Exception {
return iNewsDao.getPageCount(ntitle);
}
}
6.在Servlet中新建功能分支,接收頁面傳遞的當前頁碼,以及條件進行查詢
protected void getPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//創建分頁工具類對象
PageUtil<News> pageUtil=new PageUtil<>();
//獲取條件數據
String ntitle=req.getParameter("ntitle");
//封裝每頁顯示的記錄數
int pageSize=3;
pageUtil.setPageSize(pageSize);
try {
//封裝總記錄數
int count = iNewsService.getPageCount(ntitle);
pageUtil.setPageTotalCount(count);
//封裝當前頁碼
String pageIndex=req.getParameter("pageIndex");
if(pageIndex!=null) {
pageUtil.setPageIndex(Integer.parseInt(pageIndex));
}else {
pageIndex="1";
pageUtil.setPageIndex(Integer.parseInt(pageIndex));
}
//封裝集合數據
pageUtil.setPageList(iNewsService.getPageNewsList(pageUtil.getPageIndex(), pageUtil.getPageSize(),ntitle));
//保存pageUtil對象啊
req.setAttribute("pageUtil", pageUtil);
req.setAttribute("ntitle", ntitle);
//轉發頁面
req.getRequestDispatcher("/page/news/newsList.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
7.newsList.jsp頁面數據回顯以及上一頁下一頁帶條件搜索
<input type="text" name="ntitle" class="layui-input"
placeholder="請輸入搜索的內容" value="${ntitle }" />
數據顯示:
<table class="layui-table">
<thead>
<tr>
<th><input type="checkbox" name="allChecked" /></th>
<th>新聞編號</th>
<th>新聞標題</th>
<th>新聞類別</th>
<th>發布者</th>
<th>發布時間</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<%
PageUtil<News> pageUtil = (PageUtil<News>) request.getAttribute("pageUtil");
for (News news : pageUtil.getPageList()) {
%>
<tr>
<th><input type="checkbox" name="allChecked" /></th>
<td><%=news.getNid()%></td>
<td><%=news.getNtitle()%></td>
<td><%=news.getTopic().getTname()%></td>
<td><%=news.getNauthor()%></td>
<td><%=news.getNcreateDate()%></td>
<td><a class="layui-btn layui-btn-xs" lay-event="edit">編輯</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">刪除</a>
<a class="layui-btn layui-btn-xs layui-btn-primary"
lay-event="look">預覽</a></td>
</tr>
<%
}
%>
</tbody>
</table>
<a href="<%=basePath %>INewsServlet?action=getPage&ntitle=${ntitle}"
class="layui-btn" data-type="reload">首頁</a> <a
href="<%=basePath %>INewsServlet?action=getPage&pageIndex=<%=pageUtil.getPageIndex()-1 %>&ntitle=${ntitle}"
class="layui-btn" data-type="reload">上一頁</a> ${pageUtil.pageIndex }/${pageUtil.pageTotalNumbers }
<a
href="<%=basePath %>INewsServlet?action=getPage&pageIndex=<%=pageUtil.getPageIndex()+1 %>&ntitle=${ntitle}"
class="layui-btn" data-type="reload">下一頁</a> <a
href="<%=basePath %>INewsServlet?action=getPage&pageIndex=<%=pageUtil.getPageTotalNumbers() %>&ntitle=${ntitle}"
class="layui-btn" data-type="reload">尾頁</a>
第五天:修改新聞
修改新聞:
1.點擊編輯按鈕,請求后台Servlet獲取到當前要編輯的單條新聞數據
<a class='layui-btn layui-btn-xs' lay-event='edit' href='/NewsManager/INewsServlet?action=getNewsInfo&nid="+news.nid+"'>編輯</a>
else if(action.equals("getNewsInfo")) {
//查詢當前選擇的新聞數據
String nid=req.getParameter("nid");
try {
News news = iNewsService.getOneNews(Integer.parseInt(nid));
List<Topic> allTopic = iTopicService.getAllTopic();
req.setAttribute("news", news);
req.setAttribute("topicList", allTopic);
req.getRequestDispatcher("/page/news/newsAdd.jsp").forward(req, resp);
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
2.將數據綁定到newsAdd.jsp中,完成數據回顯
<input type="text" class="layui-input newsName" name="ntitle" lay-verify="newsName" value="${news.ntitle }" placeholder="請輸入文章標題">
<textarea placeholder="請輸入內容摘要" lay-verify="nsummary" name="nsummary" class="layui-textarea abstract">${news.nsummary }</textarea>
<img class="layui-upload-img" id="selectImg" width="200px" height="130px" src="/NewsManager/images/${news.npicPath }"/>
<textarea class="layui-textarea layui-hide" name="ncontent" lay-verify="content" id="news_content">${news.ncontent }</textarea>
<select name="ntid">
<option value="0">請選擇</option>
<c:forEach items="${topicList }" var="topic">
<c:choose>
<c:when test="${topic.tid eq news.ntid}">
<option value="${topic.tid }" selected="selected">${topic.tname }</option>
</c:when>
<c:otherwise>
<option value="${topic.tid }">${topic.tname }</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
3.區分添加功能or修改功能(公用一個頁面,實現思路為修改時肯定通過nid修改,添加時沒有nid,所以在地址欄action中加入nid屬性,然后取后台判斷)
action="<%=basePath%>INewsServlet?action=updateNews&nid=${news.nid}"
if(action.equals("updateNews")) {
String nid=req.getParameter("nid");
if(nid==null||nid.equals("")) {
insertNews(req, resp);
}else {
updateNews(req,resp);
}
}
4.實現修改操作,當點擊提交,將數據傳遞給數據庫
DaoImpl層:
@Override
public int updateNews(News news) throws Exception {
// 准備一條SQL語句
String sql = "update news set ntitle=?,nsummary=?,ncontent=?,npicpath=?,nauthor=?,nmodifyDate=?,ntid=? where nid=?";
Object[] objs = {news.getNtitle(), news.getNsummary(),news.getNcontent(),news.getNpicPath(),news.getNauthor(),news.getNmodifyDate(),news.getNtid(),news.getNid()};
return executeUpdate(sql, objs);
}
Servlet:其中有一個文件判斷,如過用戶沒有選擇文件則獲取之前的,如果選擇了則修改文件名字
protected void updateNews(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
News news=new News();
news.setNid(Integer.parseInt(req.getParameter("nid")));
//步驟一:判斷是否是文件表單
boolean isMultipartContent = ServletFileUpload.isMultipartContent(req);
if(isMultipartContent) {
FileItemFactory fileItemFactory=new DiskFileItemFactory();
//步驟二:創建ServletFileUpload對象
ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
try {
//步驟三:獲取表單提交的數據
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
//步驟四:解析數據
for (FileItem fileItem : fileItems) {
//判斷是否是普通表單數據
if(fileItem.isFormField()) {
if(fileItem.getFieldName().equals("ntitle")) {
news.setNtitle(fileItem.getString("UTF-8"));
}else if(fileItem.getFieldName().equals("nsummary")) {
news.setNsummary(fileItem.getString("UTF-8"));
}else if(fileItem.getFieldName().equals("ncontent")) {
news.setNcontent(fileItem.getString("UTF-8"));
}else if(fileItem.getFieldName().equals("ntid")) {
news.setNtid(Integer.parseInt(fileItem.getString("UTF-8")));
}
}else {
//獲取文件數據
String fileName = fileItem.getName();
if(fileName==null||fileName.equals("")) {
try {
//獲取之前的
News oneNews = iNewsService.getOneNews(Integer.parseInt(req.getParameter("nid")));
news.setNpicPath(oneNews.getNpicPath());
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}else {
//獲取上傳路徑
String realPath = getServletContext().getRealPath("/images");
//創建文件對象
File file=new File(realPath,fileName);
try {
fileItem.write(file);
news.setNpicPath(fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
try {
News_Users user = (News_Users)req.getSession().getAttribute("user");
news.setNauthor(user.getUname());
news.setNmodifyDate(new Date());
iNewsService.updateNews(news);
req.getRequestDispatcher("/page/news/newsList.jsp").forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
第六天:批量刪除
全選和反選:
//全選和反選
$("input[name=allChecked]").click(function() {
//判斷當前是選中的還是未選中的
if($(this).is(":checked")){
//所有的復選框都選中
$("input[name=newsChecked]").attr("checked",true);
}else{
//所有的復選框都選中
$("input[name=newsChecked]").attr("checked",false);
}
});
//單個復選框選中
function newsCheck(checkbox) {
//找到單個的復選框
//如果當前復選框是勾選上的,那么拿到所有的復選框,判斷是否是勾選上的,如果是都勾選上,那么全選按鈕也要勾選
//如果當前復選框是未勾選的,那么你需要將全選框去取消勾選
if($(checkbox).is(":checked")){
var flag=true;
$("input[name=newsChecked]").each(function(index,item) {
if($(item).is(":checked")){
flag=true;
}else{
flag=false;
return false;
}
});
if(flag){
$("input[name=allChecked]").attr("checked",true);
}
}else{
$("input[name=allChecked]").attr("checked",false);
}
}
批量刪除:
1.點擊批量刪除按鈕,需要將當前所選中的內容的id拿到
2.將ID數組傳遞到后台
3.在后台遍歷數組,然后循環刪除
//批量刪除
$("#deleteall").click(function() {
var array=new Array();
//獲取到所有的選中的復選框
$("input[name=newsChecked]:checked").each(function(index,item) {
array[index]=$(item).val();
});
$.ajax({
url:"/NewsManager/INewsServlet",
data:{action:"deleteAll","array":array},
type:"POST",
dataType:"JSON",
success:function(resultMap){
if(resultMap.flag==true){
layer.alert('刪除成功~');
load(1);
}else{
layer.alert(resultMap.newsId+"有評論數據,無法刪除~");
load(1);
}
}
})
});
});
else if(action.equals("deleteAll")) {
//判斷刪除成功還是失敗
boolean falg=false;
List<String> newsId=new ArrayList<String>();
Map<String, Object> resultMap=new HashMap();
//獲取傳遞的數組
String[] parameterValues = req.getParameterValues("array[]");
for (int i = 0; i < parameterValues.length; i++) {
try {
iNewsService.deleteNews(Integer.parseInt(parameterValues[i]));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (Exception e) {
falg=false;
//當新聞有評論無法刪除
newsId.add(parameterValues[i]);
}
}
resultMap.put("flag", falg);
resultMap.put("newsId", newsId);
resp.getWriter().write(JSON.toJSONString(resultMap));
}
監聽器和過濾器
1.過濾器:
生活當中,凈水器,漁網
在程序當中過濾器就是用來攔截過濾請求,假設瀏覽器發送了請求到達服務器,先會到達過濾器,可以處理一些內容,
比如解決亂碼,攔截非法登陸用戶,過濾敏感詞匯
創建過濾器:
1.創建一個類 實現Filter接口
2.重寫接口中的方法
3.配置攔截的路徑
web.xml
<!-- 配置過濾器 -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注解
@WebFilter("/*") //攔截所有的請求
public class MyFilter implements Filter {
/**
* 服務器啟動時,會創建Filter的實例,然后執行init初始化方法
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter過濾器初始化完畢。。。。。。。。。。。。。。。。。。");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("監控到了當前請求。。。。。。。。。。。。。");
//放行資源
chain.doFilter(request, response);
System.out.println("放行資源后再次執行Filter");
}
@Override
public void destroy() {
System.out.println("filter銷毀,釋放資源..............................");
}
}
過濾器執行流程:
1.客戶端發送了一個請求,請求靜態資源,過濾器先會監控到當前請求
2.如果過濾器放行了當前請求,則會請求到對應資源
3.請求完畢后,還會執行過濾器放行資源后的代碼
過濾器生命周期:
1.在容器啟動時,會創建Filter的實例,然后執行init初始化方法,該方法只執行一次
2.當監控到請求后,會執行doFIlter方法,該方法執行多次
3.當容器停止后,會調用destroy(),該方法執行一次
過濾器請求地址配置:
1.配置方案一:/* 代表所有請求的資源地址都會攔截
2.配置方案二:/*.jsp 代表只攔截.jsp結尾的請求
3.配置方案三:/user/* 分請求層次的方式進行攔截
4.配置方案四:/index.jsp 請求確切資源時攔截
過濾器請求方式配置:
注解方式配置
DispatcherType定一了請求方式:
REQUEST:默認的,代表直接請求資源時會攔截
FORWARD:轉發時攔截
ASYNC:攔截異步請求
INCLUDE:代表嵌套請求時才會攔截
ERROR:錯誤請求攔截
web.xml方式配置:再filter-mapping中加入如下配置
<dispatcher>FORWARD</dispatcher>
過濾器執行連執行順序:
注解:
根據名稱排序A-Z
web.xml
按照Filter配置的先后順序執行
2.監聽器:
1.監聽事件,例如我們向session中存放了一個數據,我在session刪除了一個數據
2.監聽器的使用
1.創建一個監聽器,實現對應接口
2.重寫接口方法,進行監聽
3.配置監聽器
注解
@WebListener
public class News_Users implements Serializable,HttpSessionBindingListener{
/**
* 序列化ID
*/
private static final long serialVersionUID = -4385525238332285976L;
private Integer uid; //用戶編號
private String uname; //用戶名稱
private String upwd; //登陸密碼
private String telephone; //手機號
private String email; //郵箱
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "News_Users [uid=" + uid + ", uname=" + uname + ", upwd=" + upwd + ", telephone=" + telephone
+ ", email=" + email + "]";
}
public News_Users(Integer uid, String uname, String upwd, String telephone, String email) {
this.uid = uid;
this.uname = uname;
this.upwd = upwd;
this.telephone = telephone;
this.email = email;
}
public News_Users() {
}
//往session存當前對象時會監聽到
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("Listener監聽到了當前對象存放到了session當中");
UserCount.COUNT++;
System.out.println(this.toString());
System.out.println("當前值:"+UserCount.COUNT);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("Listener監聽到了當前對象從session當中刪除");
UserCount.COUNT--;
System.out.println(this.toString());
System.out.println("當前值:"+UserCount.COUNT);
}
}
web.xml
<listener>
<listener-class>com.news.entity.News_Users</listener-class>
</listener>