“人生如一杯茶,不會苦一輩子,但要苦一陣子。”
你好,我是夢陽辰!和我一起學習起來吧!
文章目錄
01.JavaEE概述
Java EE實質上是sun(oracle)公司爲我們提供的強大的類庫。
Java SE實質就是sun(oracle)公司提供的一套基礎的類庫。
Java EE是 J2EE的一個新的名稱,之所以改名,目的還是讓大家清楚J2EE只是Java企業應用.隨着WEB和EJB容器概念誕生,使得軟件應用業開始擔心SUN的夥伴們是否還在Java平臺上不斷推出翻新的標準框架,致使軟件應用業的業務核心組件架構無所適從,從一直以來是否需要EJB的討論聲中說明了這種彷徨。
在2004年底中國軟件技術大會Ioc微容器(也就是Jdon框架的實現原理)演講中指出:我們需要一個跨J2SE/WEB/EJB的微容器,保護我們的業務核心組件(中間件),以延續它的生命力,而不是依賴J2SE/J2EE版本.此次J2EE改名爲Java EE,實際也反映出業界這種共同心聲。
Java EE的核心是EJB3.0, 其提供了更兼便捷的企業級的應用框架。
1.什麼是JavaSE?
Java的標準版本
sun公司爲java程序員提供的一套基礎類庫。這套基礎類庫包括基礎語法、面向對象、異常、IO、集合、反射、線程
目前JavaSE由Oracle公司維護。
2.什麼是API?包括什麼?
應用程序接口
API包括:源碼、字節碼、幫助文檔
3.JavaSE的src、字節碼、幫助文檔在哪裏?
JAVA_HOME\src.zip
JRE_HOME\lib\rt.jar
幫助文檔,官網。
4.什麼是JavaEE?
Java企業版
SUN公司爲Java程序員準備另一套龐大的類庫,幫助程序員完成企業級項目開發。
JavaEE規範是一個比較大的規範,JavaEE包括13個子規範(每一個子規範下其實還有其他的子規範)
JavaEE5規範下的子規範:
Servlet2.5
JDBC
JavaEE6規範下的子規範。
Servlet3.0
Tomcat服務器,其中Tomcat6實現了Servlet2.5規範,Tomcat實現了Servlet3.0規範。
5.JavaEE的源碼、字節碼、幫助文檔在哪裏?
02.系統架構分析
系統架構分類
C/S
B/S
什麼是C/S呢?
各種app。
優點:大部分數據都以集成到客戶端軟件中,只需要從服務器上傳送少量數據即可。速度快。
升級麻煩。
什麼是B/S呢?
客戶端爲瀏覽器。不需要安裝特定的客戶端。升級方便。
缺點:速度慢,體驗差。
以後主要的研究方向。
BS架構訪問過程
注意:Servlet接口由程序員實現,服務器來調用。
Servlet:是兩個英語單詞的合併,Serv表示服務器端,let表示小程序。
03.Servelt
Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作爲來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。
使用 Servlet,您可以收集來自網頁表單的用戶輸入,呈現來自數據庫或者其他源的記錄,還可以動態創建網頁。
知識引入:
1.Sun公司制定的JavaEE規範:Servlet規範
Servlet接口是Servlet規範中核心接口
接口注意:調用這是誰?實現者是誰?
public interface Servlet{//Servlet接口
void service();
}
2.JavaWeb程序員
JavaWeb編寫服務器端小java程序的時候,不能隨意編寫,必須實現Servlet接口。
public class DeleteServlet implements Servlet{
public void service(){
System.out.println("連接數據庫,成功...");
}
}
3.Tomcat服務器調用(自動調用)
WebServer Web服務器 ,Web Container
Web容器面向Servlet接口調用。
模擬Tomcat服務器
Tomcat服務器負責調用。2
作爲Web程序員我們只要實現Servlet接口,並配置號.xml文件即可。
04.開發第一個帶有Servlet的webapp(重點)
1.一個webapp只有一個web.xml文件。
web.xml文件主要配置請求路徑和Servlet類名之間的綁定關係。
web.xml文件在Tomcat服務器啓動階段被解析。解析失敗會導致webapp啓動失敗。web.xml文件中的標籤不能隨意編寫。
在項目目錄下必須有一個WEB-INF文件夾。並且在WEB-INF文件夾下必須有classes文件夾,lib文件夾和web.xml配置文件。
.class文件放在classes文件夾下。
實例:
編寫Java程序,將編譯生成的class文件放在classes目錄下。
配置web.xml
注意對於xml配置文件的<url-pattern>中的路徑不需要添加項目名。
但是對於Hello.html的文件的超鏈接需要在前面添加項目名,因爲超鏈接可能
會轉到其他項目中,也可能轉到其他網站,所以需要在其前面添加項目名稱。
05.在Servlet中編寫JDBC連接數據庫(重點)
java代碼:(其它類似)
package Part1;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MengYangChenWorkers implements Servlet {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>員工信息</title>");
out.print("</head>");
out.print("<body>");
out.print("<h2 align='center'>員工列表</h2>");
out.print("<hr width='60%'>");
out.print("<table border='1' align='center' width='50%'>");
out.print("<tr align='center'>");
out.print("<th>編號</th>");
out.print("<th>姓名</th>");
out.print("<th>性別</th>");
out.print("<th>部門</th>");
out.print("<th>生日</th>");
out.print("</tr>");
//JDBC
Connection conn=null;
PreparedStatement ps =null;
ResultSet rs= null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/newdata","root","0910");
String sql="select num,name,sex,classnum,birthday from t_student";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()) {
String num=rs.getString("num");
String name=rs.getString("name");
String sex=rs.getString("sex");
String classnum=rs.getString("classnum");
String birthday=rs.getString("birthday");
out.print("<tr align='center'>");
out.print("<th>"+num+"</th>");
out.print("<th>"+name+"</th>");
out.print("<th>"+sex+"</th>");
out.print("<th>"+classnum+"</th>");
out.print("<th>"+birthday+"</th>");
out.print("</tr>");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ps!=null)
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
out.print("</table>");
out.print("</body>");
out.print("</html>");
}
}
在eclipse中Ctrl+ shift +O可以快速導包。Ctrl+O提示類中所有的方法,用於快速查找。
06.Servlet的生命週期
1.什麼是生命週期
表示一個java對象從最初被創建到最終被銷燬,經歷的所有過程。
2.Servlet對象的生命週期是誰來管理的?程序員可以干涉嗎?
Servlet對象的生命週期,javaweb程序員是無權干涉的,包括該Servlet對象的相關方法的調用,javaweb程序員也是無權干涉的。Servlet對象從最初的創建,方法的調用,以及對象的銷燬,整個過程,是由WEB容器來管理的。
WEB Container管理Servlet對象的生命週期。
3.若希望在web服務器啓動階段實例話Servlet的對象需要進行特殊的設置。
4.從執行結果看:單實例多線程執行。多線程共享一個對象。
所有過程都是由web容器完成的,我們只需要編寫方法。
5.描述Servlet的生命週期。(重點)
1.用戶在瀏覽器地址欄上輸入url:http://localhost/ServletTimes/TestLifeCycle
2.web容器截取請求路徑/ServletTimes/TestLifeCycle
3.web容器在容器上下文中找請求路徑/ServletTimes/TestLifeCycle對應的Servlet對象。
4.若沒有找到對應的Servlet對象。
-
4.1.通過web.xml文件中相關的配置信息,得到請求路徑/TestLifeCycle對應得Servlet完整類名。
-
4.2.通過反射機制,調用Servlet類的無參數構造方法完成Servlet對象的實例化。
-
4.3.web容器調用Servlet對象的init方法完成初始化操作。
-
4.4.web容器調用Servlet對象的service方法提供服務。
5.若找到對應的Servlet對象。
- 5.1.web容器直接調用Servlet對象的service方法提供服務。
6.web容器關閉的時候/webapp重新部署的時候/該Servlet對象長時間沒有用戶再次訪問的時候,web容器會將該Servlet對象銷燬,在銷燬對象前,web容器會調用Servler對象的destroy方法,完成銷燬之前的準備。
總結:
Servlet類的構造方法只執行一次。
Servlet對象的init方法只執行一次。
Servlet對象的service方法,只要用戶請求一次,則執行一次。
Servlet對象的destroy方法只執行一次。
注意:init方法執行的時候,Servlet對象已經被創建好了。destroy方法執行的時候Servler對象還沒有被銷燬,即將被銷燬。
Servlet對象是單實例,但是不符合單例模式,只能稱爲僞單例,真單例的構造方法是私有化的,Tomcat服務器是至此多線程的。所以Servler對象在單實例多線程的環境下運行的。如果Servlet對象中有實例變量,並且實例變量涉及到修改操作,那麼這個Servlet對象一定會存在線程安全問題,不建議在Servlet對象中使用實例變量,儘量使用局部變量。
6.如果希望在web服務器啓動階段實例化Servlet對象,需要在web.xml文件中進行相關的配置。
<servlet>
<servlet-name>TestLifeCycle</servlet-name>
<servlet-class>Part1.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>//這個爲添加項
</servlet>
load-on-startup中1的含義:表示優先級,當有多個類時,將按照這裏的優先級,創建對象。自然數越小優先級越高。
例如:當有兩個類時。
<?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_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>Welcome.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestLifeCycle</servlet-name>
<servlet-class>Part1.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestLifeCycle</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Cycle</servlet-name>
<servlet-class>Part1.WelcomeServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Cycle</servlet-name>
<url-pattern>/Tef</url-pattern>
</servlet-mapping>
</web-app>
7.Servlet對象實例化之後,這個Servlet對象被存儲到哪裏?
大多數WEB容器都是將該Servlet對象以及對應的url-pattern存儲到Map集合中了。
在WEB容器中有這樣一個Map集合。
Map<Stirng,Servlet>集合
key value
---------------------------
/login LoginServlet對象引用
/delete DeleteServlet對象引用
/save SaveServlet對象引用
8.服務器在啓動的時候就會解析webapp的web.xml文件,做了什麼?
將web.xml文件中的url-pattern和對應的Servlet完整類名存儲到Map集合中。
在WEB集合中有這樣一個Map集合(沒找到的時候)
Map<String,String>集合
key value
----------------
/login Part1.LoginServlet
/delete Part1.DeleteServlet
9.Servlet接口中的這些方法中編寫什麼代碼?什麼時候使用這些方法。
9.1 無參構造方法【不考慮構造方法】
9.2 init方法
以上兩個方法執行事件幾乎相同,執行次數都是1,構造方法執行的時候對象正在創建,init方法執行的時候對象已經創建。
若系統要求在對象創建時刻執行一段特殊的程序,這段程序儘量寫到init方法中。
9.3 service方法。
這個方法是必然要重寫的,因爲這個方法需要完成業務邏輯的處理,請求的處理,以及完成響應。
9.4 destrory方法。
這個方法也是SUN公司爲javaweb程序員提供的一個特殊的時刻,這個特殊的時刻被稱爲對象銷燬時刻。若希望在銷燬時可執行一段特殊的代碼,需要將這段代碼編寫到destroy方法,自動被容器調用。
回顧:
類加載時刻執行程序,代碼寫到哪裏?
編寫到靜態代碼塊中。
結論:sun公司爲我們程序員提供了很多個不同的時刻。若在這個特殊時刻執行特殊的程序,這些程序是有位置編寫的。
07.UML
1.什麼是UML?
統一建模語言(Unified Modeling Language,UML)是一種爲面向對象系統的產品進行說明、可視化和編制文檔的一種標準語言,是非專利的第三代建模和規約語言。UML是面向對象設計的建模工具,獨立於任何具體程序設計語言。
UML是一個獨立的學科。
UML屬於軟件工程學
2.UML建模工具?
StarUML
Rational Rose…
3.UML圖有哪些?
類圖:描述類的信息以及類與類之間的關係。
時序圖:描述一個程序的執行過程。
狀態圖:描述一個對象的生命週期。
用例圖:站在系統用戶的角度分析系統中存在哪些功能。
08.javax.servlet.ServletConfig接口
1.Apache Tomcat服務器實現了Servlet規範,Tomcat服務器專門寫了一個ServletConfig接口的實現類。
實現類的完整類名是:org.apache.catalina.core.StandardWrapperFacade【瞭解即可】
2.javaweb程序員在編寫的時候,一直是面向ServletConfig接口去完成調用,不需要關心具體的實現類。
webapp放到Tomcat服務器中,ServletConfig的實現類是:org.apache.catalina.core.StandardWrapperFacade
webapp放到另一個服務器中(如JBOSS):ServletConfig的實現類可能是另外一個類名了。
3.Tomcat服務器是一個實現了Servlet規範和JSP規範的容器。
4.ServletConfig接口有哪些常用的方法。
//1.通過初始化參數的name獲取
String getInitParameter(String name)
//2.獲取所有初始化參數的name
Enumeration<String> getInitParameterNames()
//3.獲取ServletContext【Servlet上下文】對象
ServletContext getServletContext()
//4.獲取<servlet-name>servletname</servlet-name>
String getServletName()
對應的代碼實現:
package Part1;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServletConfigA implements Servlet {
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
//將局部變量賦值給實例變量,使得其他方法中也可以使用config
this.config=config;
System.out.println("AServlet's ServletConfig="+config.toString());
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//獲取ServletConfig
ServletConfig config=getServletConfig();
//1.通過初始化參數的name獲取value
/*
* String driver=config.getInitParameter("driver"); String
* url=config.getInitParameter("url"); String
* user=config.getInitParameter("user"); String
* passcode=config.getInitParameter("passcode");
*/
//2.獲取所有初始化參數的name
/*
* Enumeration<String> names=config.getInitParameterNames();
* while(names.hasMoreElements()) {
* String name=names.nextElement();
* String value=config.getInitParameter(name);
* out.print(name+"="+value);
* out.print("<br>"); }
*/
//3.獲取ServletContext【Servlet上下文】對象
ServletContext application =config.getServletContext();
out.print(application.toString());
//4.獲取servlet Name
/*
* String servletName=config.getServletName();
* out.print("<servlet-name>"+servletName+"</servlet-name>");
*/
/*
* out.print(driver); out.print("<br>"); out.print(url); out.print("<br>");
* out.print(user); out.print("<br>"); out.print(passcode);
*/
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
//這個方法供子類使用,在子類中若想獲取ServletConfig,可以調用這個方法
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return config;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
5.ServletConfig到底是什麼?
ServletConfig是一個Servlet對象的配置信息對象,ServletConfig對象中封裝了一個Servlet對象的配置信息。
Servlet對象的配置信息在web.xml文件中。
一個Servlet對象對應一個ServletConfig對象,100個Servlet對象對應100個ServletConfig對象。
7.將init方法中的ServletConfig參數移動到service方法中,因爲我們程序員主要編寫的方法是service方法,在service方法中我們可能需要使用Sevletconfig接口。
7.1在init方法中完成:局部變量config賦值給實例變量config
7.2實現getServletConfig方法,提供公開的get方法目的是供子類使用。
09.javax.servlet.ServletContext接口
1.javax.servlet.ServletContext接口,Servlet規範。
2.Tomcat服務器對ServletContext接口的實現類的完整類名:org.apache.catalina.core.ApplicationContextFacade
javaweb程序員還是只需要面向ServletContext接口調用方法即可,不需要關心Tomcata具體的實現。
3.ServletContext到底是什麼?什麼時候被創建?什麼時候被銷燬?創建幾個?
ServletContext被翻譯爲:Servlet上下文【Context一般翻譯爲上下文】
一個webapp只有一個ServletContext對象
一個webapp只有一個web.xml文件,web.xml文件服務器啓動階段被解析。
ServletContext在服務器啓動階段被實例化。
ServletContex在服務器關閉的時候會被銷燬。
ServletContext對應的是web.xml文件,是web.xml文件的代表。
ServletContext是所有Servlet對象四周環境的代表。【在同一個webapp中,所有的Servlet對象共享一個四周環境對象,該對象就是Servletcontext】
所有的用戶若想共享同一個數據,可以將這個數據放到ServletContext對象中。
一般放到ServletContext對象中的數據是不建議修改操作的。因爲ServletContext是多線程共享的一個對象,修改的時候會存在線程安全問題。
4.ServletContext接口中有哪些常用方法?
//從ServletContext範圍中獲取數據(Object value=map.get(key);)
Object getAttribute(String name)
//移除ServletContext範圍的數據(map.remove(key);)
void removeAttribute(String name)
//向ServletContext範圍中添加數據value(map.put(key,value))
void setAttribute(String name,Object object)
String getInitParameter(String name)
Enumeration getInitParameterNames()
String gerRealPath(String path)
5.Servlet,ServletConfig,ServletContext之間的關係。
一個Servlet對應一個ServletConfig,100個Servlet對應100個ServletConfig
所有的Servlet共享一個ServletContext對象。
6.ServletContext範圍可以完成快用戶傳遞數據。
總結:
所有編寫過的路徑:
1.超鏈接
<a href="/webappname/xxx"></a>
2.web.xml中的url-pattern
<url-pattern></url-pattern>
3.form表單的action屬性
<form action="/webappname/xxx"></form>
4.application.getRealPath(path);
10.歡迎頁面和HTTP狀態碼
1.歡迎頁面怎麼設置?
假設在WebContent目錄下創建index.html,想讓index.html作爲整個webapp的歡迎也頁面。應該做這樣的設置。
在web.xml文件的開始
<welcome-file-list>
<welcome-file>Welcome.html</welcome-file>
</welcome-file-list>
設置歡迎頁面的目的
爲了訪問更方便,爲了提高用戶的體驗。
2.歡迎頁面可以設置多個
如果上一個資源找不到或者不存在,會往下查找。越往上優先級越高。
3.歡迎頁面設置的時候,路徑不需要以“/”開始。
<welcome-file>index.html</welcome-file>
要求在webapp的根目錄下,必須有一個文件,叫做index.html
<welcome-file>html/welcome.html</welcome-file>
要求在webapp的根目錄下,必須有一個文件夾html,該文件夾必須有一個文件叫做welcome.html
4.一個webapp的歡迎頁面不一定是一個HTML資源,可以是任何一種類型的web資源,歡迎頁面可以是Servlet.
5.歡迎頁面包括全局配置和局部配置。
全局配置:catalina_home/conf/web.xml
局部配置 :CATALINA_HOME/webapps/webapp/WEB-INF/web.xml
注意:就近原則
若一個頁面的名稱是:index.html,index.htm,index.jsp,這些都是默認的歡迎頁面,在全局配置中配置過了。
在webapp中常見的錯誤代碼:
404 Not Found【資源未找到:請求的資源路徑寫錯了】
500 Server Inner Error【服務器內部錯誤,這種情況一般都是java程序出現異常】
404和500是HTTP協議狀態碼。
以上的這些狀態號是W3C制定的,所有瀏覽器和服務器都必須遵守。
正常響應的HTTP協議狀態碼:200【ok】。
可以設置錯誤提示頁面(讓交互性更好):
在web.xml中編輯:
<error-page>
<error-code>404</error-code>
<location>/error/error.html<location>
<error-page>
<error-page>
<error-code>404</error-code>
<location>/error/error.html<location>
<error-page>
路徑總結:
第一類:以/開始,加webapp名稱。
第二類:以/開始,不加webapp名稱。
除以上兩類之外,歡迎頁面設置比較特殊,不以/開始,不加webapp的名字。
成功不是將來纔有的,而是從決定去做的那一刻起,持續累積而成。你好,我是夢陽辰!期待下次的相遇!
關注公衆號【輕鬆玩編程】回覆關鍵字“電子書”,“計算機資源”,“Java從入門到進階”,”JavaScript教程“,“算法”,“Python學習資源”,“人工智能”等即可獲取學習資源。