話說大家都在說java EE,但是java EE的分層結構如下:
1、數據持久層:主要由一些負責操作POJO(Plain Old Java Object)的類構成,主要負責將數據保存進入數據庫;
2、數據訪問層:主要由一些DAO(Data access Object)的類構成,主要負責數據庫數據的增刪改查操作,進一步降低數據操作的粒度;
3、業務邏輯層:主要由一些業務邏輯對象組成,主要負責實現系統需要的業務方法實現;
4、業務控制層:主要由一些控制器組成,主要負責攔截獲取用戶請求,完成業務邏輯對象的調用,並根據處理結果轉發的不同的業務表示層;
5、業務表示層:主要由一些視圖組件構成,主要負責收集用戶的請求,並顯示處理的結果;
通過這種分層模型,形成標準的MVC模型,123構成M層,4構成C層,5構成V層,達到了各層組件間鬆散的耦合,以非硬編碼的方式組合,使系統有更好的擴展性,儘量實現代碼的複用。
下面通過一個例子記錄:
一、實現表示層,主要是jsp頁面:
1、第一個jsp文件 index.jsp內容:
<%--
Document : add
Created on : 2016-10-30, 10:54:52
Author : guochaoxxl
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>計算器</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body bgcolor="ffffc0">
<h1>算術計算器</h1>
<form id="calcForm" method="post" action="add.action">
<table>
<tbody>
<tr>
<td>第一個數:</td>
<td><input type="text" name="num1"/></td>
</tr>
<tr>
<td>第二個數:</td>
<td><input type="text" name="num2"/></td>
</tr>
<tr>
<td><input type="submit" value="加"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
2、第二個jsp文件add_result.jsp內容:
<%--
Document : add_result
Created on : 2016-10-30, 10:49:25
Author : guochaoxxl
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>計算器</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body bgcolor="ffffc0">
<h1>算術計算器</h1>
<table>
<tbody>
<tr>
<td>第一個數:</td>
<td>${param.num1}</td>
</tr>
<tr>
<td>第二個數:</td>
<td>${param.num2}</td>
</tr>
<tr>
<td>結果</td>
<td>${requestScope.result}</td>
</tr>
</tbody>
</table>
<button οnclick="history.go(-1);">返回</button>
</body>
</html>
二、實現模型層,主要是java代碼,完成基本的邏輯功能:
1、第一個java文件Calculator.java內容:
package edu.jju;/**
*
* @author guochaoxxl
*/
public class Calculator {
public double add(double var1, double var2){
return var1 + var2;
}
public double sub(double var1, double var2){
return var1 - var2;
}
public double mul(double var1, double var2){
return var1 * var2;
}
}
2、第二個java文件Action.java內容:
package edu.jju;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author guochaoxxl
*/
public interface Action {
String execute(HttpServletRequest request, HttpServletResponse response);
}
該接口主要定義了一個方法execute(),參數包括request和response兩個,返回的字符串對象,就是執行成功要轉發的頁面
3、第三個java文件AddAction.java內容:
package edu.jju;
import edu.jju.Calculator;
import edu.jju.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author guochaoxxl
*/
public class AddAction implements Action{
private Calculator cal = new Calculator();
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
double num1 = Double.parseDouble(request.getParameter("num1"));
double num2 = Double.parseDouble(request.getParameter("num2"));
double result = cal.add(num1, num2);
request.setAttribute("result", result);
return "add_result.jsp";
}
}
實現接口Action,重寫execute()方法。
三、控制模型層,主要是java代碼,完成模型層和視圖圖的對接工作:
1、第一個java文件Controller.java內容:
package edu.jju;
import edu.jju.Action;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author guochaoxxl
*/
public class Controller extends HttpServlet{
private HashMap actionMap;
/**
*
* @throws ServletException
*/
@Override
public void init() throws ServletException{
actionMap = new HashMap();
actionMap.put("add", new AddAction());
}
private Action determinActionByPath(String path){
String actionName = path.substring(path.lastIndexOf('/') + 1, path.length() - 7);
Action ret = (Action)actionMap.get(actionName);
return ret;
}
/**
*
* @param request
* @param response
* @throws javax.servlet.ServletException
* @throws java.io.IOException
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
String path = request.getServletPath();
Action action = (Action)this.determinActionByPath(path);
String resultView = action.execute(request, response);
if(null != resultView){
request.getRequestDispatcher(resultView).forward(request, response);
}
}
/**
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
this.doGet(request, response);
}
}
2、第二個xml文件web.xml內容:
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>edu.jju.Controller</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
由於文件Controller.java是基於Servlet實現的一個控制器,在處理請求過程中,先根據請求路徑找到要執行的Action對象,調用其中的execute(),根據execute()方法返回的路徑,轉發到相應的jsp頁面。Servlet需要在web.xml文件中進行配置,servlet部分主要完成類名和類的完整路徑的說明,servlet-mapping部分主要是配置影射路徑和請求匹配的對象。
四、運行結果: