struts2自界說MVC框架。本站提示廣大學習愛好者:(struts2自界說MVC框架)文章只能為提供參考,不一定能成為您想要的結果。以下是struts2自界說MVC框架正文
本文實例為年夜家分享了struts2自界說MVC框架的辦法,供年夜家參考,詳細內容以下
自界說MVC: (起首懂得Model1和Model2的概念)
Model1與Model2:
Model1:就是一種純jsp開辟技巧,將營業邏輯代碼和視圖襯著代碼雜糅在一路。
Model2:Model2是在Model1的基本上,將營業邏輯的代碼分別開來,零丁構成一個Servlet,Model2也是基於MVC開辟。
總結MVC特色以下:
(1)數據的獲得和顯示分別
(2)掌握器將分歧的模子和視圖組合在一路
(3)運用分為三部門,三部門之間松耦歸並協同任務,從而進步運用的可擴大性和可保護性
(4)各層擔任分歧的功效,各司其職,每層的組件具有雷同的特點,便於經由過程工程化和對象化發生法式代碼
MVC思惟及其優勢(很強勢)
MVC是一種架構形式,目標是將模子(營業邏輯)、視圖(表現層)分別,使模子和視圖可以自力修正互不影響。年夜多半軟件在設計架構時都采取此形式。應用MVC形式有許多處,當一個經由過程閱讀器閱讀的體系想要開辟手機版本時,只須要從新開辟視圖,模子部門的營業邏輯可以重用。很多軟件須要同時推出B/S和C/S版本,采取MVC形式,模子部門可以重用,只須要開辟分歧的視圖便可。MVC思惟將一個運用分紅三個根本部門M(Model,模子)V(View,視圖)C(Controller,掌握器)。個中M表現處置營業邏輯的部門,V表現顯示數據和獲得用戶輸出的部門,C相似中介,包管M和V不會直接交互。
根本步調以下:
1.創立XML文檔Framework.xml
2.界說Action接口
3.界說一個actionMapping類,視為action節點
4.界說ActionMappingManage類來治理ActionMapping類(actions節點)
5.界說ActionManager類應用反射機制依據字符串類型的類名獲得到詳細的類(web.xml標簽的書寫)
6.編寫servlet停止運轉機會的掌握
7.界說LoginAction類停止測試
1.創立XML文檔Framework.xml
<!--?xml version="1.0" encoding="UTF-8"?-->
<!-- 界說束縛文件 -->(標注)
<!-- ELEMENT 表現元素 -->
<!-- ATTLIST 表現屬性 -->
<!-- CDATA 表現字符串類型 -->
<!-- REQUIRED 表現此屬性必需的寫 -->
<!-- *代表多個 -->
<!-- IMPLIED 表現此屬性可寫 -->
<!-- redirect 重定向或轉發 -->
<!--ELEMENT actions (action)-->
<!--ELEMENT action (result*)-->(*表現可以多個)
<!--ATTLIST action name CDATA #REQUIRED
class CDATA #REQUIRED
-->
<!--ATTLIST RESULT name CDATA #IMPLIED
redirect (true|false) "false"
-->
]>
<framework>
<!-- 停止測試 -->
<actions>
<action name="loginAction" class="cn.hq.Action.LoginAction">
<result name="success">success.jsp</result>
<result name="login">index.jsp</result>
</action>
</actions>
</framework>
留意:空格和<>的書寫標准。
節點的條理。
2.界說Action接口
留意:excute參數的書寫,要求和呼應。
3.界說一個actionMapping類,視為action節點(停止action節點的標簽的書寫)
停止封裝字段和results聚集的添加數據。
留意:添加數據的書寫。(Map聚集)
4.界說ActionMappingManage類來治理ActionMapping類(actions節點)
/*
* action節點不止一個
* 用來來治理ActionMapping類
*/
public class ActionMappingManager {
//actionMapping類的聚集
private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();
public ActionMapping getActionMapping(String name)
{
return maps.get(name);
}
//解析在src項面前目今的一切設置裝備擺設文件
//實例化終了落後行解析
public ActionMappingManager(String[] file){
for (String filename : file) {
Init(filename);
}
}
//init初始化辦法
//解析xml文檔
public void Init(String path){
try {
InputStream is=this.getClass().getResourceAsStream("/"+path);
//解析xml
Document doc=new SAXReader().read(is);
//獲得根節點
Element root = doc.getRootElement();
//獲得actions節點
Element actions=(Element)root.elementIterator("actions").next();
//應用for輪回來遍歷actions節點下的一切action節點
for(Iterator<Element> action=actions.elementIterator("action");action.hasNext();)
{
//獲得到<action>節點
Element actionnext = action.next();
//分離獲得到action節點中的name屬性和class屬性
String name = actionnext.attributeValue("name");
String classname = actionnext.attributeValue("class");
//將以上兩個屬性保留到ActionMapping類中
ActionMapping mapp=new ActionMapping();
mapp.setClassname(classname);
mapp.setName(name);
//因為一個action節點下有多個result節點 遍歷action下一切的result節點
for(Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();)
{
//獲得到result節點
Element resultnext = result.next();
//提取result節點的name屬性值和result節點中的值
String resultname = resultnext.attributeValue("name");
String resultvalue=resultnext.getText();
//將其分離存入到actionMapping中的雙列聚集中去,便利挪用actionMapping類(actionMapping類中就稀有據了!)
mapp.addResult(resultname, resultvalue);
System.out.println(mapp.getName());
}
//獲得一切action節點的聚集
maps.put(mapp.getName(), mapp);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
歸納綜合:
經由過程dom4j解析Framework.xml設置裝備擺設文件。從而獲得根節點,和actions節點,並經由過程for輪回遍歷actions節點下的action節點拿到name和class的屬性值,因為一個action節點下有多個result節點 及遍歷action下一切的result節點,分離存入到actionMapping中的雙列聚集中,最初獲得一切action節點的聚集。
留意:Init辦法的書寫,和ActionMappingManager帶參數組的書寫。
5.界說ActionManager類應用反射機制依據字符串類型的類名獲得到詳細的類
public class ActionManager {
public static Action getActionClass(String classname)
{
Class clazz=null;
Action action=null;
//獲得以後線程的類加載器
try {
//假如線程中的有那末一個類,直接依據類名獲得該類的類型
clazz=Thread.currentThread().getContextClassLoader().loadClass(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(clazz==null)
{
try {
//假如該線程中沒有,那末應用class.forname辦法獲得
clazz=Class.forName(classname);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(action==null)
{
try {
//將獲得到的類型轉換為action,挪用無參結構函數,某種水平上相當於new,不外new須要指定類型
action=(Action)clazz.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return action;
}
}
web.xml的節點設置裝備擺設:
6.編寫servlet停止運轉機會的掌握(servlet,初始化一切的類)
public class MyServlet extends HttpServlet {
/**
*你很菜
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}<br>
/**
*持續盡力
*/
ActionMappingManager man=null;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲得ActionMapping對象
ActionMapping actionMapping = man.getActionMapping(getPath(request));
//獲得action接口反射機制
Action action = ActionManager.getActionManager(actionMapping.getClassname());
try {
String message=action.execute(request, response);
String results = actionMapping.getResults(message);
response.sendRedirect(results);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 獲得要求的途徑名
*/
public String getPath(HttpServletRequest request){
//項目+要求地址
String requestURI = request.getRequestURI();
//項目稱號
String contextPath = request.getContextPath();
//詳細要求
String path = requestURI.substring(contextPath.length());
String filename = path.substring(1,path.lastIndexOf("."));
return filename;
}
/*
*重寫init,法式運轉加載一切類
*
*/
@Override
public void init(ServletConfig config) throws ServletException {
//config對象是javax.servlet.ServletConfig的對象,功效是取得初始化設置裝備擺設信息
//config.getInitParameter是獲得指命名稱的初始化參數內容
String filename = config.getInitParameter("config");
String [] filenames=null;
if(filename==null){
//假如為空 ,
filenames=new String[]{"Framework.xml"};
}else{
//若果有其他的設置裝備擺設參數信息,那末以,分隔存入數組中
filenames=filename.split(",");
}
//應用init辦法停止初始化
man=new ActionMappingManager(filenames);
}
}
留意:代碼的條理及正文。
7.界說LoginAction類停止測試
public class LoginAction implements Action{
@Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if(name.equals("1")&&pwd.equals("1")){
return SUCCESS;
}else{
return LOGIN;
}
}
}
jsp代碼:
完成後果:
再長的路,一步步也能走完,再短的路,不邁開雙腳也沒法達到。
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。