創建項目
打開eclipse,創建一個空的項目:
依次進行:File–>New–>Dynamic web project,出現以下彈窗。
輸入項目名稱StudentManagerWeb,一直next,到了創建項目的最後一步在這裏打上勾,點擊Finish。
項目結構如下:
src:java文件
WebContent:存放前端的目錄,如CSS文件,JS,JSP文件等。
lib:存放jar文件。
導入網頁模板
將素材解壓,將easyui,h-ui和index.jsp複製到WebContent目錄下。其中index.jsp是網頁打開默認訪問的頁面。打開之後可以看到這樣的一句代碼:
<jsp:forward page="/WEB-INF/view/login.jsp"></jsp:forward>
即訪問到這個index.jsp之後,會重定向到view/login.jsp頁面。
爲什麼會默認訪問到index.jsp呢?
我們可以打開WEB-INF目錄下的web.xml,裏面內容爲:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>StudentManagerWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
表示WebContent目錄下,如果存在index.html,啓動之後,那麼就會優先訪問index.html頁面,是按照從上到下的順序來進行訪問,在我們的案例中,文件夾下不存在index.html和index.htm,所以默認訪問的頁面是目錄中存在的index.jsp頁面。若都沒有這些文件,那麼在訪問時會報一個404的錯誤。
因爲用不着上面的部分代碼,我們可以只保留一行,web.xml內部就只有以下這些了。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>StudentManagerWeb</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
因爲view目錄下並沒有login.jsp,所以我們需要創建一個jsp文件。
創建完成之後,我們在這個jsp的body中輸入hello world 來驗證。
右擊項目名稱,選擇Debug As ,選擇第一項Debug on server,等待項目發佈。
此時發佈之後,會在瀏覽器中顯示剛剛body中的信息。
接下來將模板複製到login.jsp中
打開素材WEB-INF文件夾下的view,將login.jsp的內容拷貝到我們所創建的login.jsp的文件中。
刷新瀏覽器可以看到這樣的頁面。
點擊圖片實現驗證碼的切換
需要實現一個servlet的流程,即將用戶行爲傳遞到服務器,服務器對此行爲作出一個響應。
- 創建包:com.ischoolbar.programmer.servlet
- 創建Servlet類:CpachaServlet,此類要繼承HttpServlet。
- 在web.xml中配置
<servlet>
<description>驗證碼</description>
<servlet-name>CpachaServlet</servlet-name>
<servlet-class>com.ischoolbar.programmer.servlet.CpachaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CpachaServlet</servlet-name>
<url-pattern>/CpachaServlet</url-pattern>
</servlet-mapping>
<servlet>標籤
:<description>標籤
:<servlet-name>標籤
:<servlet-class>標籤
:<servlet-mapping>標籤
:<url-pattern>標籤
:
注意:<servlet>標籤
和<servlet-mapping>標籤
要成對存在。
配置好之後,我們之後在瀏覽器中訪問/CpachaServlet
時,所有的請求都會對應到com.ischoolbar.programmer.servlet.CpachaServlet
來進行響應。
(1)測試CpachaServlet能否正常工作:
public class CpachaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{
res.getWriter().write("hello world");
}
}
HttpServletRequest request
HttpServletResponse response
測試一下:
啓動項目後,進入了默認的頁面,我們在狀態欄的後面加上CpachaServlet
,即我們在web.xml中的servlet中配置的訪問路徑,回車進行訪問,可以在頁面上看到:
說明我們已經可以訪問CpachaServlet了。
用戶通過訪問路徑,通過配置文件將用戶請求轉送到了servlet文件裏面,這個servlet接收到請求之後做出了一個迴應,並輸出在了瀏覽器頁面中。
(2)CpachaServlet代碼完善:
下面對代碼再做一些修改:
public class CpachaServlet extends HttpServlet {
private static final long serialVersionUID = 3198908369323678077L;
public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{
doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException{
res.getWriter().write("hello world");
}
}
-
doPost
get -
doGet
post
以上代碼是在doGet方法中調用了doPost方法,所以不論用什麼方法進行提交,都能夠進入到doPost方法中。
考慮到代碼的複用性,我們接下來定義一個工具類,用於生成驗證碼:
先定義一個名爲com.ischoolbar.programmer.util
的package,再定義一個名爲CpachaUtil
的工具類。
(3)實現驗證碼功能
① Java代碼:
回到CpachaServlet,核心代碼如下:
public class CpachaServlet extends HttpServlet {
private static final long serialVersionUID = 3198908369323678077L;
public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException{
doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException{
String method = req.getParameter("method");
if("loginCapcha".equals(method)){
generateLoginCpacha(req, res);
return;
}
res.getWriter().write("error method");
}
private void generateLoginCpacha(HttpServletRequest req,HttpServletResponse res) throws IOException{
CpachaUtil cpachaUtil = new CpachaUtil();
String generatorVCode = cpachaUtil.generatorVCode();
// 創建的驗證碼,快速寫到
req.getSession().setAttribute("loginCapcha", generatorVCode);
BufferedImage generatorRotateVCodeImage = cpachaUtil.generatorRotateVCodeImage(generatorVCode, true);
ImageIO.write(generatorRotateVCodeImage,"gif",res.getOutputStream());
}
②修改前端部分代碼
回到login.jsp,其中有兩個部分與驗證碼相關。
- 一個是驗證碼的點擊事件要觸發CpachaServlet。
- 二是將請求發送到CpachaServlet。
<!--html 代碼 -->
<div class="row cl">
<div class="formControls col-8 col-offset-3">
<input class="input-text size-L" name="vcode" type="text" placeholder="請輸入驗證碼" style="width: 200px;">
<img title="點擊圖片切換驗證碼" id="vcodeImg" src="CpachaServlet?method=loginCapcha">
</div>
</div>
// JS代碼
$(function(){
//點擊圖片切換驗證碼
$("#vcodeImg").click(function(){
this.src="CpachaServlet?method=loginCapcha&t="+new Date().getTime();
});
}
這裏的點擊事件要觸發,觸發所指向的地址是CpachaServlet,因爲我們要在這個Servlet中去處理請求。第二點,因爲在CpachaServlet中String method = req.getParameter("method");
一行用於獲取請求中所攜帶的參數,就是這裏的loginCapcha
,用於判定這條請求是不是用來生成驗證碼的請求,如果是,就生成驗證碼並返回給前端頁面。
修改之後進行保存,運行項目,可以看到驗證碼已經生成了。
web.xml其他的一些配置
所有的servlet都需要在web.xml進行配置才能夠使用。我們先打開web.xml進行配置,默認的404頁面不好看,我們 可以先設置一下。
打開web.xml在<web-app>
的標籤內添加以下代碼:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
error-page
:第一個指的是一旦發生了404錯誤,那麼就跳轉到404.jsp頁面。第二個指的是發生了關於數據庫的錯誤,就跳轉到505.jsp頁面。好看的頁面可以提升用戶體驗。
servlet 代表着業務邏輯的控制器。
<servlet>
<description>登錄</description>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.lizhou.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
servlet-name
:表示servlet的名字是什麼。
servlet-class
:servlet所對應的java類是哪一個。
servlet-mapping
:表示servlet的映射。
url-pattern
:表示該servlet所對應的web訪問路徑。