struts1之簡(jiǎn)單mvc示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
先看MVC模式流程圖(其實(shí)MVC設(shè)計(jì)模式就是java中的model2。):

就像圖上所標(biāo)識(shí)的C層主要是Servlet層控制頁(yè)面跳轉(zhuǎn),M層就是具體的業(yè)務(wù)處理邏輯,而JSP就是所謂的V層。MVC是有別于我們所說(shuō)的三層,我們平常所說(shuō)的三層是UI層、BLL層、DAL層,具體的區(qū)別如圖:

從圖上能看出來(lái),JSP和Servlet構(gòu)成了UI層,而Model層分成了BLL層和DAL層(也就是業(yè)務(wù)邏輯和數(shù)據(jù)持久層)。
從理論上認(rèn)清了MVC設(shè)計(jì)模式之后,下面開(kāi)始動(dòng)手敲一個(gè)MVC設(shè)計(jì)模式示例代碼:
JSP索引頁(yè)面index.jsp:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <form action="servlet/addUser.action" method="post"> 姓名:<input type="text" name="username" > <input type="submit" value="提交"> </form> </body> </html>
業(yè)務(wù)邏輯代碼UserManager:
package com.bjpowernode.servlet;
import java.util.ArrayList;
import java.util.List;
public class UserManager {
public void addUser(String username){
System.out.println("UserManager.addUsre()--->username:"+username);
}
public void delUser(String username){
System.out.println("UserManager.delUser()--->username:"+username);
}
public void modifyUser(String username){
System.out.println("UserManager.modifyUser()--->username"+username);
}
public List queryUser(String username){
System.out.println("UserManager.queryUser()--->username"+username);
List userList=new ArrayList();
userList.add("a");
userList.add("b");
userList.add("c");
return userList;
}
}
Servlet控制代碼:
package com.bjpowernode.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI=request.getRequestURI();
System.out.println("request="+requestURI);
String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
System.out.println("path="+path);
String username=request.getParameter("username");
UserManager userManager=new UserManager();
//userManager.addUser(username);
String forward="";
if("/servlet/delUser".equals(path)){
userManager.delUser(username);
forward="/del_success.jsp";
}else if("/servlet/addUser".equals(path)){
userManager.addUser(username);
forward="/add_success.jsp";
}else if("/servlet/modifyUser".equals(path)){
userManager.modifyUser(username);
forward="/modify_success.jsp";
}else if("/servlet/queryUser".equals(path)){
List userList=userManager.queryUser(username);
request.setAttribute("userList", userList);
forward="/query_success.jsp";
}else{
throw new RuntimeException("請(qǐng)求失敗");
}
request.getRequestDispatcher(forward).forward(request, response);
}
這個(gè)servlet代碼主要實(shí)現(xiàn)的功能判斷是那個(gè)頁(yè)面請(qǐng)求服務(wù)器做那些操作,之后調(diào)用業(yè)務(wù)邏輯實(shí)現(xiàn)相應(yīng)業(yè)務(wù)操作。
配置Servlet:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>test_Servlet</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> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.cjq.servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
輸出結(jié)果:

通過(guò)上面的示例已經(jīng)對(duì)MVC設(shè)計(jì)模式有了初步的認(rèn)識(shí),其實(shí)這個(gè)示例是對(duì)Struts框架學(xué)習(xí)的基礎(chǔ),只有弄清楚了這個(gè)實(shí)例才能弄清楚Struts框架的實(shí)現(xiàn)原理和Struts框架使用。
那么我們?cè)趺床拍芡ㄟ^(guò)這個(gè)示例引入Struts框架呢?這個(gè)問(wèn)題從IF-Eles開(kāi)始。
首先我們看到了TestServlet中出現(xiàn)了許多if-else語(yǔ)句,這樣是非常不穩(wěn)定的,這樣的程序是非常不靈活的,以后如果有變化,那么維護(hù)是非常差的;而且我們?cè)趇f-else中出現(xiàn)了大量的字符串,這樣在coding的時(shí)候會(huì)出現(xiàn)寫錯(cuò),這樣無(wú)形中給調(diào)試帶來(lái)了麻煩。所以去掉if-else成了我們重構(gòu)的第一步,也是我們進(jìn)行Struts框架學(xué)習(xí)的第一步。因?yàn)樵赥estServlet中出現(xiàn)了If-Else語(yǔ)句塊,所以讓程序變得不再靈活,讓應(yīng)付需求變化時(shí)變得笨拙。所以就承接上篇文章來(lái)重構(gòu)一下TestServlet代碼,主要是用繼承多態(tài)來(lái)進(jìn)一步對(duì)TestServlet進(jìn)行重構(gòu)。
下面進(jìn)入重構(gòu)階段:
package com.bjpowernode.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI=request.getRequestURI();
System.out.println("request="+requestURI);
String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
System.out.println("path="+path);
String username=request.getParameter("username");
UserManager userManager=new UserManager();
//userManager.addUser(username);
String forward="";
if("/servlet/delUser".equals(path)){
userManager.delUser(username);
forward="/del_success.jsp";
}else if("/servlet/addUser".equals(path)){
userManager.addUser(username);
forward="/add_success.jsp";
}else if("/servlet/modifyUser".equals(path)){
userManager.modifyUser(username);
forward="/modify_success.jsp";
}else if("/servlet/queryUser".equals(path)){
List userList=userManager.queryUser(username);
request.setAttribute("userList", userList);
forward="/query_success.jsp";
}else{
throw new RuntimeException("請(qǐng)求失敗");
}
request.getRequestDispatcher(forward).forward(request, response);
}
}
首先我們看到了在每個(gè)語(yǔ)句塊中都出現(xiàn)了給forward賦值,其實(shí)也就是給頁(yè)面跳轉(zhuǎn)的路徑賦值,針對(duì)每個(gè)請(qǐng)求路徑判斷來(lái)賦值跳轉(zhuǎn)路徑。另外每個(gè)IF-Else語(yǔ)句塊中都有業(yè)務(wù)處理,我們要把這些業(yè)務(wù)處理分別放到類里面,讓職責(zé)更加單
一,這樣更加符合面向?qū)ο蟮乃悸贰?/p>
就從這里我們開(kāi)始重構(gòu),我們可以將這個(gè)跳轉(zhuǎn)路徑和業(yè)務(wù)邏輯封裝起來(lái)。
既然封裝,那么我們就抽象出來(lái)一個(gè)借口,主要完成一個(gè)方法,這個(gè)方法主要的功能就是要完成業(yè)務(wù)邏輯封裝和路徑跳轉(zhuǎn)的返回。隨后建立四個(gè)類,主要實(shí)現(xiàn)相應(yīng)的增刪改查的業(yè)務(wù)處理和處理之后的跳轉(zhuǎn)路徑返回。
代碼如下:
接口Action:
package com.bjpowernode.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public String execute(HttpServletRequest request,HttpServletResponse response)
throws Exception;
}
增刪改查實(shí)現(xiàn)類:
添加用戶實(shí)現(xiàn)類:
package com.bjpowernode.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddUserAction implements Action {
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
userManager.addUser(username);
return "/add_success.jsp";
}
}
刪除用戶實(shí)現(xiàn)類:
package com.bjpowernode.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DelUserAction implements Action {
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
userManager.delUser(username);
return "/del_success.jsp";
}
}
更新用戶實(shí)現(xiàn)類:
package com.bjpowernode.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ModifyUserAction implements Action {
@Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
userManager.modifyUser(username);
return "/modify_success.jsp";
}
}
查詢用戶實(shí)現(xiàn)類:
package com.bjpowernode.servlet;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class QueryUserAction implements Action {
@Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
List userList=userManager.queryUser(username);
request.setAttribute("userList", userList);
return "/query_success.jsp";
}
}
TestServlet類重構(gòu)如下:
package com.bjpowernode.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI=request.getRequestURI();
System.out.println("request="+requestURI);
String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
System.out.println("path="+path);
Action action=null;
if("/servlet/delUser".equals(path)){
action=new DelUserAction();
}else if("/servlet/addUser".equals(path)){
action=new AddUserAction();
}else if("/servlet/modifyUser".equals(path)){
action=new ModifyUserAction();
}else if("/servlet/queryUser".equals(path)){
action=new QueryUserAction();
}else{
throw new RuntimeException("請(qǐng)求失敗");
}
String forward=null;
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
request.getRequestDispatcher(forward).forward(request, response);
}
}
運(yùn)行結(jié)果:
這樣TestServlet類雖然沒(méi)有徹底去掉If-Else,但是這樣的代碼變得更加簡(jiǎn)練,利用多肽實(shí)現(xiàn)業(yè)務(wù)邏輯處理和路徑跳轉(zhuǎn)返回。職責(zé)更加清晰,讓維護(hù)變得更加輕松。
package com.bjpowernode.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI=request.getRequestURI();
System.out.println("request="+requestURI);
String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
System.out.println("path="+path);
Action action=null;
if("/servlet/delUser".equals(path)){
action=new DelUserAction();
}else if("/servlet/addUser".equals(path)){
action=new AddUserAction();
}else if("/servlet/modifyUser".equals(path)){
action=new ModifyUserAction();
}else if("/servlet/queryUser".equals(path)){
action=new QueryUserAction();
}else{
throw new RuntimeException("請(qǐng)求失敗");
}
String forward=null;
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
request.getRequestDispatcher(forward).forward(request, response);
}
}
解決字符串問(wèn)題,當(dāng)然就要用到配置文件了,用到配置文件就要有用來(lái)讀取配置文件的相關(guān)的類和方法,這里就用dom4j中的類來(lái)讀取配置文件,這里的配置文件的書(shū)寫是有點(diǎn)邏輯上的難度的。
我們來(lái)看TestServlet中的代碼,我們要在這個(gè)testservlet中實(shí)現(xiàn)讀取配置文件和path比較,還有利用多肽實(shí)例化相應(yīng)的實(shí)現(xiàn)類,最后通過(guò)實(shí)例化的實(shí)現(xiàn)類的方法來(lái)返回跳轉(zhuǎn)路徑,最終跳轉(zhuǎn)到相應(yīng)的頁(yè)面。
所以我們的配置文件就要不僅配上testservlet中出現(xiàn)的字符串,還要配置相應(yīng)的Action接口的實(shí)現(xiàn)類(我們可以利用反射來(lái)實(shí)例化該類的對(duì)象,進(jìn)而使用這個(gè)類的所有屬性和方法),另外還有跳轉(zhuǎn)路徑字符串。這樣我們的配置文件就變成了如下代碼所示:
<?xml version="1.0" encoding="UTF-8"?>
<action-config>
<action path="/servlet/delUser" type="com.cjq.servlet.DelUserAction">
<forward name="success">/del_success.jsp</forward>
<forward name="error">/del_error.jsp</forward>
</action>
<action path="/servlet/addUser" type="com.cjq.servlet.AddUserAction">
<forward name="success">/add_success.jsp</forward>
<forward name="error">/add_error.jsp</forward>
</action>
<action path="/servlet/modifyUser" type="com.cjq.servlet.ModifyUserAction">
<forward name="success">/modify_success.jsp</forward>
<forward name="error">/modify_error.jsp</forward>
</action>
<action path="/servlet/queryUser" type="com.cjq.servlet.QueryUserAction">
<forward name="success">/query_success.jsp</forward>
<forward name="error">/query_error.jsp</forward>
</action>
</action-config>
我們有了配置文件之后就要想法通過(guò)相關(guān)類讀取,并且實(shí)現(xiàn)相應(yīng)的功能。所以這里用dom4j來(lái)讀取完成。其實(shí)如果能把這個(gè)邏輯捋順之后就能發(fā)現(xiàn),其實(shí)懂我們利用dom4j讀取完配置文件的時(shí)候,我們是取得的是一個(gè)配套的匹配路徑字符串、相應(yīng)業(yè)務(wù)邏輯類還有處理業(yè)務(wù)邏輯之后跳轉(zhuǎn)頁(yè)面路徑字符串。這樣我們就能直截了當(dāng)?shù)娜サ袅薸f-else。(這里可能邏輯上會(huì)出現(xiàn)一些困難,但是看到下面的重構(gòu)之后的testservlet中的代碼和讀取配置文件之后的代碼就會(huì)一目了然)。
現(xiàn)在等待解決的問(wèn)題就是我們要把從配置文件取得的一整套內(nèi)容放到那里,當(dāng)然這是毋庸置疑的要放到類中。所以我們就建立一個(gè)ActionMapping類來(lái)放我們的那一整套內(nèi)容。
ActionMapping中的代碼如下:
package com.bjpowernode.servlet;
import java.util.Map;
public class ActionMapping {
private String path;
private Object type;
private Map forwardMap;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Object getType() {
return type;
}
public void setType(Object type) {
this.type = type;
}
public Map getForwardMap() {
return forwardMap;
}
public void setForwardMap(Map forwardMap) {
this.forwardMap = forwardMap;
}
}
現(xiàn)在ActionMapping類已經(jīng)有了,剩下的工作就是要利用dom4j來(lái)讀取配置文件類,具體代碼如下:
package com.bjpowernode.servlet;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlConfigReader {
private static XmlConfigReader instance=new XmlConfigReader();
ActionMapping actionMapping=new ActionMapping();
private Document doc;
private Map actionMap=new HashMap();
private XmlConfigReader(){
try {
SAXReader reader=new SAXReader();
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("action_config.xml");
doc=reader.read(in);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ActionMapping getActionMapping(String path){
synchronized(this){
Object type=null;
/*if(action.containsKey(path)){
type=action.get(path);
}*/
Element eltAction = (Element)doc.selectObject("http://action[@path=\"" + path + "\"]");
try{
type=Class.forName(eltAction.attributeValue("type")).newInstance();
}catch(Exception e){
e.printStackTrace();
}
Element eltForwards = eltAction.element("forward");
for (Iterator iter = eltForwards.elementIterator(); iter.hasNext();) {
Element eltForward = (Element) iter.next();
actionMap.put( eltForward.attributeValue("name"),eltForward.getTextTrim());
}
actionMapping.setPath(path);
actionMapping.setType(type);
actionMapping.setForwardMap(actionMap);
return actionMapping;
}
}
public static synchronized XmlConfigReader getInstance(){
return instance;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ActionMapping actionMapping=XmlConfigReader.getInstance().getActionMapping("/servlet/delUser");
System.out.println(actionMapping.getPath());
System.out.println(actionMapping.getType());
System.out.println(actionMapping.getForwardMap().toString());
}
}
我們通過(guò)返回ActionMapping來(lái)動(dòng)態(tài)創(chuàng)建出action相應(yīng)的實(shí)現(xiàn)類,進(jìn)而完成業(yè)務(wù)邏輯和頁(yè)面跳轉(zhuǎn),重構(gòu)之后的TestServlet代碼如下:
package com.bjpowernode.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI=request.getRequestURI();
System.out.println("request="+requestURI);
String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
System.out.println("path="+path);
String forward="";
ActionMapping actionMapping=XmlConfigReader.getInstance().getActionMapping(path);
Action action=(Action)actionMapping.getType();
try {
forward=action.execute(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
request.getRequestDispatcher(forward).forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
我們可以清晰的看到if-else已經(jīng)沒(méi)有了,字符串也已經(jīng)沒(méi)有了。通過(guò)這篇文章對(duì)if-else還有字符串問(wèn)題的解決,又一次重構(gòu)了testservlet代碼,程序相對(duì)靈活許多。通過(guò)這一次的重構(gòu),我們已經(jīng)看到了struts框架的雛形,
- Java框架Struts2實(shí)現(xiàn)圖片上傳功能
- Java框架學(xué)習(xí)Struts2復(fù)選框?qū)嵗a
- struts2標(biāo)簽總結(jié)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Struts1之url截取_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- struts1之ActionServlet詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Struts1教程之ActionMapping_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- java struts2框架簡(jiǎn)介
- Java struts2 package元素配置及實(shí)例解析
相關(guān)文章
springboot 如何設(shè)置端口號(hào)和添加項(xiàng)目名
這篇文章主要介紹了springboot設(shè)置端口號(hào)和添加項(xiàng)目名的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
使用自定義注解+springAop實(shí)現(xiàn)參數(shù)非空校驗(yàn)方式
這篇文章主要介紹了使用自定義注解+springAop實(shí)現(xiàn)參數(shù)非空校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
mybatis的動(dòng)態(tài)sql之if test的使用說(shuō)明
這篇文章主要介紹了mybatis的動(dòng)態(tài)sql之if test的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java中調(diào)用SQL Server存儲(chǔ)過(guò)程詳解
這篇文章主要介紹了Java中調(diào)用SQL Server存儲(chǔ)過(guò)程詳解,本文講解了使用不帶參數(shù)的存儲(chǔ)過(guò)程、使用帶有輸入?yún)?shù)的存儲(chǔ)過(guò)程、使用帶有輸出參數(shù)的存儲(chǔ)過(guò)程、使用帶有返回狀態(tài)的存儲(chǔ)過(guò)程、使用帶有更新計(jì)數(shù)的存儲(chǔ)過(guò)程等操作實(shí)例,需要的朋友可以參考下2015-01-01
mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Spring源碼解析之BeanPostProcessor知識(shí)總結(jié)
今天給大家?guī)?lái)的文章是Spring的相關(guān)知識(shí),文章圍繞著B(niǎo)eanPostProcessor的使用展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06
javaWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳
這篇文章主要為大家詳細(xì)介紹了JAVAWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

