3.1安裝Tomcat
3.2Tomcat啟動和配置
3.3配置
高難度面試題:
請你談談網站是如何進行訪問的!
1.輸入一個域名:回車
2.檢查本機的C:\Windows\System32\drivers\etc\hosts配置文件下有沒有這個域名映射;
1.有:直接返回對應的ip地址,這個地址中,有我們需要訪問的web程序,可以直接訪問
127.0.0.1 www.zhaodong.com
2.沒有:去DNS服務器找找到的話就返回,找不到就返回找不到
3。可以配置一下環境變量
3.4發布一個web網站
不會就先模仿,將自己寫的網站,放到服務器Tomcat中指定的web應用文件夾webapps下,就可以訪問了
網站應該有的結構
-- webapps: Tomcat服務器的web目錄
-ROOT
-kuangstudy:網站的目錄名
-Web-INF
-classes:java程序
-lib:web應用所依賴的jar包
-web.xml:網站配置文件
-index.html 默認的首頁
4.HTTP
4.1什么是HTTP
HTTP(超文本傳輸協議)是一個簡單的請求-響應協議,它通常運行在TCP之上。
-
文本:html,字符串
-
超文本:圖片,音樂,視頻定位,地圖。。。。
-
80
HTTPS:安全的
-
443
4.2兩個時代
HTTP/1.0:客戶端可以與web服務器連接后,只能獲得一個web資源,斷開連接
HTTP/1.1:客戶端可以與web服務器連接后,可以獲得多個web資源。
4.3HTTP請求
客戶端----發請求----服務器
百度:
Request URL:https://www.baidu.com/ 請求地址
Request Method:GET get方法/post方法
Status Code:200 OK 狀態碼:200
Remote Address:182.61.200.7:443
1.請求行
-
請求行終的請求方式:GET
-
請求方式:Get,Post ,HEAD,DELETE,PUT,TRACT...
-
get:請求能夠攜帶的參數比較少,大小有限制,會在瀏覽器的URL地址欄顯示數據內容,不安全,但高效
-
post:請求能夠攜帶的參數沒有限制,大小沒有限制,不會在瀏覽器的URL地址欄顯示數據內容,安全,但不高效。
-
2.消息頭
Accept: 告訴瀏覽器,它所支持的數據類型
Accept-Encoding: 告訴瀏覽器,它所支持的編碼格式 GBK UTF-8 GB2312
Accept-Language:告訴瀏覽器,它的語言環境
cache-Control:緩沖控制
connection:告訴瀏覽器,請求完成是斷開還是保持連接
Host:主機..../.
4.4HTTP響應
服務器---響應----客戶端
百度:
Cache-Control:private 緩沖控制
Connection:keep-alive 連接
Content-Encoding:gzip 編碼
Content-Type:text/html;charset=utf-8 類型
1.響應體
Accept: 告訴瀏覽器,它所支持的數據類型
Accept-Encoding: 告訴瀏覽器,它所支持的編碼格式 GBK UTF-8 GB2312
Accept-Language:告訴瀏覽器,它的語言環境
cache-Control:緩沖控制
connection:告訴瀏覽器,請求完成是斷開還是保持連接
Host:主機..../.
Refrush:告訴客戶端,多久刷新一次
Location:讓網頁重新定位;
2.響應狀態碼
200:請求響應成功 200
3**:請求重定向
-
重定向:你重新道我給你信位置去;
4xx:找不到資源;404
5xx:服務器代碼錯誤 500 502網關錯誤
常見面試題:
當你的瀏覽器中地址欄輸入地址並回車的一瞬間到頁面能夠展示回來,經歷了什么?
5.Maven
我為什么要學習這個技術?
-
在JavaWeb中,需要使用大量的jar包,我們手動去導入;
-
如何個夠讓一個東西自動幫我導入和配置這個jar包。
-
由此,Maven誕生了!
5.1Maven項目架構管理工具
我們目前來救是方便導入jar包的!
Maven的核心思想:約定大於配置
-
有約束,不要去違反。
-
Maven會規定好你該如何去編寫我們java代碼,必須按照這個規范
5.2下載安裝Maven
下載完成后,解壓即可;
電腦上的所有環境都放在一個文件夾下,方便管理
5.3配置環境變量
在我們的系統環境變量中
配置如下配置:
-
M2_HOME maven 目錄下的bin目錄
-
MAVEN_HOME maven的目錄
-
在系統的path中配置%MAVEN_HOME%\bin
5.4阿里雲鏡像
-
鏡像:mirrors
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
5.5本地倉庫
-
建立本地倉庫
-
<localRepository>/path/to/local/repo</localRepository> -->
5.6在idea中使用Maven
-
啟動idea
-
創建一個maven項目
-

-

解決警告問題
必須要的配置:為什么會有這個問題:我們訪問一個網站,需要制定一個文件夾名字


5.7標記文件夾目錄

Maven的注意事項:
<!--在build中配置resources,來防止我們資源導出失敗的問題-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
5.8maven中遇到的問題
idea中每次都要重復配置Maven


6.Servlet
6.1Servlet簡介
-
Servlet就是sun公司開發動態web的一門技術
-
sun公司在這些API中提供一個接口叫作:Servlet,如果你想開發一個Servlet程序,只需要完成兩個小步驟:
-
編寫一個類,實現Servlet接口
-
把開發好的java類部署道web服務器中。
-
把實現了Servlet接口的java程序叫做Servlet
6.2HelloServlet
Servlet接口Sun公司有兩個默認的實現類:HttpServlet,GenericServlet
1.構建一個普通的maven項目,刪掉里面的src目錄。以后我們的學習就在這個項目里面建立Moudel;這個空的工程就是Maven的主工程;
2.關於Maven父子工程的理解
父項目中會有一個
<modules>
<module>servlet-01</module>
</modules>
子項目中會有一個
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.dong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父項目中的java子項目可以直接使用
son extends parents
web配置文件更改
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
3.Maveb環境優化
1.修改web。xml為最新的
2.將maven的結構搭建完整
4.編寫一個Servlet程序
1.編寫一個普通類
2.實現Servlet接口,這里我們直接繼承HTTPServlet
public class HelloServlet extends HttpServlet {
//由於get或者post只是請求實現的不同的方式,可以互相調用,業務邏輯都一樣
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//響應流
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
5.編寫Servlet的映射
為什么需要映射:我們寫的是java程序,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務器,所以我們要在web服務中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑;
<!-- 注冊Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.dong.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet的請求路徑-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6.配置Tomcat
注意:配置項目發布的路徑就可以了
7.啟動測試
6.3Servlet原理
Servlet是由Web服務器調用,web服務器在收到瀏覽器請求之后,

6.4Mapping問題
-
一個Servlet可以指定一個映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> -
一個Servlet可以指定多個映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> -
一個Servlet可以指定通用映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping> -
默認請求路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> -
指定一些后綴或者前綴等待.....
<!-- 可以自定義后綴實現請求映射
注意點:*前面不能加項目映射的路徑-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
6.優先級問題
指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求;

6.5ServletContext
web容器在啟動的時候,它會為每個web程序都創建一個對應的ServletContext對象,它代表了當前的web應用
1.共享數據
在這個Servlet保存的數據,可以在另一個Servlet拿到
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter() 初始化參數
//this.getServletConfig() Servlet配置
//this.getServletContext() Servlet 上下文
ServletContext context = this.getServletContext();
String username="趙東";
context.setAttribute("username",username);//將一個數據保存在了ServletContext中,名字為:username,值username
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.dong.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.dong.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
2.獲取初始化參數
<!-- 配置一些web應用初始化參數-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url=context.getInitParameter("url");
resp.getWriter().print(url);
}
3.請求轉發
ServletContext context = this.getServletContext();
System.out.println("進入了ServletDemo04");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/demo");//轉發的請求
//requestDispatcher.forward(req,resp);//調用forward實現請求轉發
context.getRequestDispatcher("/demo").forward(req,resp);
請求轉發與重定向區別

4.讀取資源文件
Properties
-
在java目錄下新建properties
-
在resources目錄下新建properties
發現:都被打包到了同一個路徑下:classes,我們俗稱這個路徑為類路徑
思路:需要一個文件流
username=root password=123456
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream in = this.getServletContext().getResourceAsStream("/target/classes/db.properties");
Properties properties = new Properties();
properties.load(in);
String user = properties.getProperty("username");
String pwd = properties.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
6.6HttpServletResponse
web服務器接收到客戶端的http請求,針對這個請求,分別創建一個代表請求的HTTPServletRequest對象,代表響應的一個HTTPServletResponse;
-
如果要獲取客戶端請求過來的參數:找HttpServletRequest
-
如果要給客戶端響應一些信息:趙HTTPServletResponse
1.簡單分類
-
負責向瀏覽器發送數據的方法
-
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
-
負責向瀏覽器發送響應頭的方法
-
void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1);響應的狀態碼
-
int SC_CONTINUE = 100; int SC_SWITCHING_PROTOCOLS = 101; int SC_OK = 200; int SC_CREATED = 201; int SC_ACCEPTED = 202; int SC_NON_AUTHORITATIVE_INRMATION = 203; int SC_NO_CONTENT = 204; int SC_RESET_CONTENT = 205; int SC_PARTIAL_CONTENT = 206;
2.下載文件
1.向瀏覽器輸出消息
2.下載文件
1. 要獲取下載文件的路徑 2. 下載的文件名是啥? 3. 設置想辦法讓瀏覽器能夠支持下載我們需要的東西 4. 獲取下載文件的輸入流 5. 創建緩沖區 6. 獲取OutputStream對象 7. 將FileOutputStream流寫入到buffer緩沖區 8. 使用OutputStream將緩沖區中的數據輸出到客戶端!
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要獲取下載文件的路徑
String realPath="D:\\IDEA\\javaweb-02-servlet\\response\\src\\main\\resources\\1.jpg";
System.out.println("下載文件的路徑:"+realPath);
// 2. 下載的文件名是啥?
String fileName=realPath.substring(realPath.lastIndexOf("\\")+1);
// 3. 設置想辦法讓瀏覽器能夠支持(Content-Disposition)下載我們需要的東西,中文文件名URLEncoder.encode編碼,否則可能亂麻
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// 4. 獲取下載文件的輸入流
FileInputStream in = new FileInputStream(realPath);
// 5. 創建緩沖區
int len=0;
byte[] buffer= new byte[1024];
// 6. 獲取OutputStream對象
ServletOutputStream out = resp.getOutputStream();
// 7. 將FileOutputStream流寫入到buffer緩沖區,使用OutputStream將緩沖區中的數據輸出到客戶端!
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
3.驗證碼功能
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何讓瀏覽器3秒自動刷新一次
resp.setHeader("refresh", "3");
//在內存中創建一個圖片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//得到圖片
Graphics2D g = (Graphics2D) image.getGraphics();//筆
//設置圖片的北京顏色
g.setColor(Color.white);
g.fillRect(0, 0, 80, 20);
//給圖片寫數據
g.setColor(Color.BLUE);
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(), 0, 20);
//告訴瀏覽器,這個請求用圖片的方式打開
resp.setContentType("image/jpg");
//網站存在緩沖,布讓瀏覽器緩沖
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no1-cache");
//把圖片寫給瀏覽器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
//生成隨機數
private String makeNum () {
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7 - num.length(); i++) {
sb.append("0");
}
num = sb.toString() + num;
return num;
}
4.實現重定向

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.setHeader("Location","/down");
// resp.setStatus(302);
resp.sendRedirect("/down");//重定向
}
面試題:請你聊聊重定向和轉發的區別?
相同點:
-
頁面都會實現跳轉
不同點
-
請求轉發的時候,url不會產生變化
-
重定向的時候,url地址欄會產生變化
用戶登陸:
void sendRedirect(String var1) throws IOException;
6.7HttPServletRequest
HttPServletRequest代表客戶端的請求,用戶通過Http協議訪問服務器,HTTP請求中的所有信息會被封裝到HttPServletRequest,通過HttPServletRequest的方法,獲得客戶端的所有信息。
1.獲取前端傳遞的參數
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("===========================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
System.out.println("============================");
//通過請求轉發
req.getRequestDispatcher("/success.jsp").forward(req,resp);
resp.setCharacterEncoding("utf-8");
}
7.Cookie、Session
7.1會話
會話:用戶打開一個瀏覽器,點擊了很多超鏈接,訪問多個web資源,關閉瀏覽器這個過程可以稱之為會話。
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過
一個網站怎么證明你來過?
客戶端 服務端
1.服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了;cookie
2.服務器登記你來過了,下次你來的時候我來匹配你;session
7.2保存會話的兩種技術
cookie
-
客戶端技術(通過響應,請求)
session
-
服務器技術,利用這個技術,可以保存用戶的會話信息?我們可以把信息或者數據放在Session中!
常見問題:網站登錄之后,下次不用再登錄了,第二次就直接上去了
7.3Cookie

1.請求中拿到cookie信息
2.服務器響應給客戶端cookie
Cookie[] cookies=req.getCookiles();//獲得cookie
cookie.getName();//獲得cookie中的key
cookie.getValue();//獲得cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一個cookie
cookie.setMaxAge(24*60*60);//設置cookie的有效期
resp.addCookie(cookie);//響應給客戶端一個cookie
cookie:一般會保存在本地的 用戶目錄下 appdata
一個網站cookie是否存在上限!
-
一個cookie只能保存一個信息
-
一個web站點可以給瀏覽器發送多個cookie,最多存放20個cookie
-
cookie大小有限制4kb
-
300個cookie瀏覽器上限
刪除cookie:
-
不設置有效期,關閉瀏覽器,自動失效;
-
設置有效期時間為0;

7.4Session(重點)
什么是Session:

-
服務器會給每一個用戶(瀏覽器)創建一個Session對象
-
一個Session獨占一個瀏覽器,只要瀏覽器沒有關閉,這個Session就存在
-
用戶登陸之后,整個網站它都可以訪問!-->保存用戶的信息
Session和cookie的區別
-
Cookie是把用戶的數據寫給用戶的瀏覽器,瀏覽器保存(可以保存多個)
-
Session把用戶的數據寫到用戶獨占Session中,服務器端保存(保存重要的信息,減少服務器資源的浪費)
-
session由服務器創建
使用場景:
-
保存一個登陸用戶的信息;
-
購物車信息;
-
在整個網站中經常會使用的數據,我們將它保存在session中
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("Text/html;charset=utf-8");
//得到session
HttpSession session = req.getSession();
//給session中存東西
session.setAttribute("name","趙東");
//獲取session的id
String sessionId = session.getId();
//判斷session是不是新創建
if (session.isNew()){
resp.getWriter().write("session創建成功,ID:"+sessionId);
}else {
resp.getWriter().write("session已經在服務器中存在了,ID:"+sessionId);
}
//Session創建的時候做了什么事情
// Cookie cookie = new Cookie("JSESSIONID", sessionId);
// resp.addCookie(cookie);
}

8.JSP
8.1什么是jsp
Java Server Pages:Java服務器端頁面,也和Servlet一樣,用於動態web技術!
最大的特點:
-
寫jsp就像在寫HTML
-
區別:
-
HTML只給用戶提供靜態的數據
-
JSP頁面中可以嵌入java代碼,為用戶提供動態數據
-
8.2JSP原理
思路:jsp到底怎么執行的

瀏覽器向服務器發送請求,不管訪問什么資源,其實都是在訪問Servlet!
JSP最終也會被轉換成為一個java類!
JSP本質上就是一個Servlet
//初始化
public void _JspInit(){
}
//銷毀
public void _jspDestroy(){
}
//JSPService
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response){}

final javax.servlet.jsp.PageContext pageContext;//頁面上下文 javax.servlet.http.HttpSession session=null; //session final javax.servlet.ServletContext application;//applicationContext final javax.servlet.ServletConfig config;//config javax.servlet.jsp.JspWriter out = null;//out final java.lang.Object page = this;//page:當前 javax.servlet.jsp.JspWriter _jspx_out = null; //請求 javax.servlet.jsp.PageContext _jspx_page_context = null;//響應
3.輸出頁面前增加的代碼
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;
4.以上這些對象我們可以在jsp中隨便使用

在jsp頁面中:
只要是java代碼就會原封不動的輸出
如果是html代碼,就會轉換為
out.wtire("<html>\r\n");
這樣的格式,輸出到前端!
8.3jsp基礎語法
任何語言都有自己的語法,JAVA中有。JSP作為java技術的一種應用,它擁有一些自己擴充的語法(了解知道即可),java所有語法都支持!
jsp表達式
<%--jsp表達式 作用:將程序的輸出,輸出到客戶端 <%= 變量或者表達式%>--%> <%= new java.util.Date()%>
jsp腳本片段
<%--jsp腳本片段--%>
<%
int sum=0;
for (int i = 0; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
<%--腳本再實現,在代碼嵌入HTML元素--%>
<%
for (int i = 0; i <5 ; i++) {
%>
<h1>hello,world</h1>
<%
}
%>
jsp聲明
<%!
static{
System.out.println("Loading Servlet!");
}
private int globalVar =0;
public void kuang(){
System.out.println("進入了方法狂!");
}
%>
JSP聲明:會被編譯到JSP生成java的類中!其他的,會被生成道JSPService方法中
在jsp,嵌入java代碼即可
<%%>腳本片段 <%=%>輸出變量或者表達式 <%!%>聲明 <%--注釋--%>
jsp的注釋,不會在客戶端顯示,html會顯示
8.4jsp指令
在xml文件里配置
<!-- 自定義配置錯誤頁面-->
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>

8.5 9大內置對象
-
PageContext 存東西
-
Request 存東西
-
Response
-
Session 存東西
-
Application [ServletContext] 存東西
-
conifg [ServletConfig]
-
out
-
page
-
exception

<%--內置對象--%>
<%
pageContext.setAttribute("name1","趙東1號");//保存的數據只在一個頁面中有效
request.setAttribute("name2","趙東2號");//保存的數據只在一次請求中有效,請求轉發會攜帶這個數據
session.setAttribute("name3","趙東3號");//保存的數據只在一次會話中有效,從打開瀏覽器道關閉瀏覽器
application.setAttribute("name4","趙東4號");//保存的數據只在服務器中有效,從打開服務器道關閉服務器
%>
<%--腳本片段中的代碼,會被原封不動生成道JSP.java
要求:這里的代碼:必須保證Java語法的正確性
--%>
<%
//從pageContext取出,我們通過尋找的方式來
//從底層到高層(作用域):
String name1=(String) pageContext.findAttribute("name1");
String name2=(String) pageContext.findAttribute("name2");
String name3=(String) pageContext.findAttribute("name3");
String name4=(String) pageContext.findAttribute("name4");
String name5=(String) pageContext.findAttribute("name5");
%>
<%--使用el表達式輸出 ${}}--%>
<h1>取出的值為:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%></h3>
8.6jsp標簽、jstl標簽
<!--jstl表達式依賴-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--standard標簽庫-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表達式: ${}
-
獲取數據
-
執行運算
-
獲取web開發的常用對象





9.JavaBean
實體類
JavaBean有特定的寫法:
-
必須要有一個無參構造
-
屬性必須私有化
-
必須有對應的get/set方法
一般用來和數據庫的字段做映射 ORM
ORM:對象關系映射
-
表-->類
-
字段-->屬性
-
行記錄-->對象
| id | name | age | address |
|---|---|---|---|
| 1 | 趙東1號 | 3 | 山西 |
| 2 | 趙東2號 | 18 | 山西 |
| 3 | 趙東3號 | 26 | 山西 |
class People{
private int id;
private String name;
private String adress
}
10.MVC三層架構
什么是mvc: Model view Controller 模型、視圖、控制器
10.1早些年

用戶直接訪問控制層,控制層就可以直接操作數據庫;



11.Filter
1.Filter:過濾器,用來過濾網站的數據;
-
處理中文亂碼
-
登陸驗證

寫過濾器:
1.導包
2.編寫過濾器


public class CharacterEncodingFilter implements Filter {
//初始化:web服務器啟動,就已經初始化了,隨時等待過濾對象出現!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter 初始化");
}
//Chain:鏈
/*
* 1.過濾中的所有代碼,在過濾特定請求的時候都會執行
* 2.必須要讓過濾器繼續同行
* chain.doFilter(request,response);
* */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter執行前");
filterChain.doFilter(request,response);//讓我們的請求繼續走,如果不寫,程序到這就被攔截停止!
System.out.println("CharacterEncodingFilter執行后");
}
//銷毀:web服務器關閉的時候,過濾會銷毀
public void destroy() {
System.out.println("CharacterEncodingFilter銷毀");
}
}
3.在web.xml中配置Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.dong.filter.CharacterEncodingFilter</filter-class>
</filter>
<!-- 只要是/servlet的任何請求,都會經過這個過濾器-->
<!-- <url-pattern>/*</url-pattern> -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>

12.監聽器
實現一個監聽器的接口;(有N種)
1.編寫一個監聽器
實現監聽器的接口...


2.xml中配置監聽器

3.看情況是否使用
13.過濾器、監聽器常見應用
監聽器:GUI編程中經常使用;

用戶登錄之后才能進入主頁!用戶注銷后就不能進入主頁
14.JDBC
JDBC(Java database connect):Java連接數據庫!

需要jar包的支持:
-
java.sql
-
javax.sql
-
mysql-conneter-java...連接驅動(必須要導入)
1.創建SQL(表和內容)
CREATE TABLE `jdbc`.`users`( `id` int(4) UNSIGNED ZEROFILL not NULL auto_increment COMMENT '學號', `name` VARCHAR(40), `password` VARCHAR(40), email varchar(60), birthday DATE, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT charset=utf8; INSERT INTO users(id,`name`,`password`,email,birthday) VALUES(1,'張三','123456','555@qq.com','2000-01-01'); INSERT INTO users(id,`name`,`password`,email,birthday) VALUES(2,'李四','123456','333@qq.com','2000-01-01'); INSERT INTO users(id,`name`,`password`,email,birthday) VALUES(3,'王五','123456','222@qq.com','2000-01-01');
2.在xml導入SQL -jar包依賴
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
3.在idea中連接數據庫

4.編寫jdbc
固定步驟:
1.加載驅動
2.連接數據庫,代表數據庫
3.向數據庫發送SQL的對象Statement:CRUD
4.編寫sql(根據業務,不同的SQL)
5.執行SQL
6.關閉連接
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//獲取配置信息
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="123456";
//1.加載驅動
Class.forName("com.mysql.jdbc.Driver");
//2.連接數據庫
Connection connection = DriverManager.getConnection(url, username, password);
//3.向數據庫發送sql的對象statement:CRUD
Statement statement = connection.createStatement();
////PreparedStatement preparedStatement = connection.prepareStatement(sql);預編譯,先編寫SQL,在這個時候把sql放進去
//4.編寫sql語句
String sql="select * from users";
//5.查詢sql語句,返回result結果集
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id"+resultSet.getObject("id"));
System.out.println("name"+resultSet.getObject("name"));
System.out.println("password"+resultSet.getObject("password"));
System.out.println("email"+resultSet.getObject("email"));
System.out.println("birthday"+resultSet.getObject("birthday"));
}
//6.查詢結束,關閉資源
resultSet.close();
statement.close();
connection.close();
}
}
//受影響的行數,增刪改都用executeUpdate(sql)
int i = statement.executeUpdate(sql);
預編譯sql
public class TestJdbc2 {
public static void main(String[] args) throws Exception {
//獲取配置信息
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="123456";
//1.加載驅動
Class.forName("com.mysql.jdbc.Driver");
//2.連接數據庫
Connection connection = DriverManager.getConnection(url, username, password);
//3.編寫sql語句
String sql="insert into users(id, name, password, email, birthday) values(?,?,?,?,?)";
//4.預編譯
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,4);//給第一個?占位符賦值為1
preparedStatement.setString(2,"趙六");
preparedStatement.setString(3,"123456");
preparedStatement.setString(4,"1395950933@qq.com");
preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));
//5.執行SQL
int i = preparedStatement.executeUpdate();
if(i>0){
System.out.println("插入成功!");
}
//6.關閉數據庫
preparedStatement.close();
connection.close();
}
}
事務

Junit單元測試
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
