jsp和servlet+新聞發布系統


第一章.初始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.TomcatWeb服務器)

  WebLogic

  Ngnix

  Resin

4.TomcatWeb服務器,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應用的根目錄,該目錄下所有文件在客戶端都可以訪問(JSPHTML)

/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處理亂碼方案二:

TomcatServer.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會話中的數據:當用戶退出系統時,我們利用sessionremove方法刪除數據

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.cookiesession區別

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是一個自定義的類,暴露給客戶端一個訪問地址,可以實現跟用戶交互

.Servlet3種創建方式

方法一:新建一個類,實現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(手動重寫doGetdoPost

@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("GetPost請求都能執行");

 

}

}

.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容器釋放會調度Servletdestroy方法

 

.JSPServlet交互(模擬登陸退出)

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(一個類對應的一個數據庫表)  GradeGradeId   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和連接池

 

.JNDIJava 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放到tomcatlib文件夾下

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();

}

}

}

 

第八章:ELJSTL

.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的加載

jarcopyweb-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,修改hrefServlet地址

"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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM