基于MVC模式封装一个自己的Structs案例
来源:互联网 发布:恢复手机数据的软件 编辑:程序博客网 时间:2024/06/05 00:37
一.需求
1.MVC模式
Model 模型View 视图Control 控制器
2.Control 控制器
Servlet起到控制器作用! ----> 获取请求数据封装 【BeanUtils可以优化,(调用方法?)】 ----> 调用Service处理业务逻辑 ----> 跳转(转发/重定向)【跳转代码写死】
3.传统mvc开发总结:
1. 跳转代码写死,不灵活2. 每次都去写servlet,web.xml中配置servlet! (配置目的: 请求, Servlet处理类)
4.需求:
登陆、注册 登陆成功---首页注册成功 ---登陆 ---首页
二、基于MVC模式封装一个自己的Structs案例
1.逻辑图
2.代码实现
1).核心控制器代码
package com.chinano1edu.framework;import java.io.IOException;import java.lang.reflect.Method;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.itcast.framework.bean.ActionMapping;import cn.itcast.framework.bean.ActionMappingManager;import cn.itcast.framework.bean.Result;/* * 核心控制器,此项目只有这一个servlet * 1. 拦截所有的*.action为后缀的请求 * 2. 请求:http://localhost:8080/mystruts/login.action * http://localhost:8080/mystruts/register.action */public class ActionServlet extends HttpServlet{ private ActionMappingManager actionMappingManager; // 只执行一次(希望启动时候执行) @Override public void init() throws ServletException { System.out.println("ActionServlet.init()"); actionMappingManager = new ActionMappingManager(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String uri = request.getRequestURI(); String actionName=uri.substring(uri.lastIndexOf("/")+1, uri.indexOf(".action")); // 2. 根据路径名称,读取配置文件,得到类的全名 ActionMapping actionMapping = actionMappingManager.getActionMapping(actionName); String className = actionMapping.getClassName(); // 当前请求的处理方法 String method = actionMapping.getMethod(); // 3. 反射: 创建对象,调用方法; 获取方法返回的标记 Class<?> clazz = Class.forName(className); Object obj = clazz.newInstance(); //LoginAction loginAction = new LoginAction(); Method m = clazz.getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class ); // 调用方法返回的标记 String returnFlag = (String) m.invoke(obj, request, response); // 4. 拿到标记,读取配置文件得到标记对应的页面 、 跳转类型 Result result = actionMapping.getResults().get(returnFlag); // 类型 String type = result.getType(); // 页面 String page = result.getPage(); // 跳转 if ("redirect".equals(type)) { response.sendRedirect(request.getContextPath() + page); } else { request.getRequestDispatcher(page).forward(request, response); } } catch (Exception e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
2.xml配置
<?xml version="1.0" encoding="UTF-8"?><mystruts> <package> <!-- 配置请求路径,与处理action类的关系 --> <!-- 1. 请求路径与处理Action的关系 /login = LoginAction login success = /index.jsp 登陆成功(重定向) loginFaild = /login.jsp 登陆失败--> <action name="login" class="com.chinano1edu.com.framework.action.LoginAction" method="login"> <result name="loginSuccess" type="redirect">/index.jsp</result> <result name="loginFaild">/login.jsp</result> </action> <action name="register" class="com.chinano1edu.com.framework.action.RegisterAction" method="register"> <result name="registerSuccess">/login</result> </action> </package></mystruts>
3).配置文件内容读取代码
package com.chinano1edu.com.framework.bean;import java.io.InputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * 加载配置文件, 封装所有的真个mystruts.xml */public class ActionMappingManager { // 保存action的集合 private Map<String,ActionMapping> allActions ; public ActionMappingManager(){ allActions = new HashMap<String,ActionMapping>(); // 初始化 this.init(); } /** * 根据请求路径名称,返回Action的映射对象 * @param actionName 当前请求路径 * @return 返回配置文件中代表action节点的AcitonMapping对象 */ public ActionMapping getActionMapping(String actionName) { if (actionName == null) { throw new RuntimeException("传入参数有误,请查看struts.xml配置的路径。"); } ActionMapping actionMapping = allActions.get(actionName); if (actionMapping == null) { throw new RuntimeException("路径在struts.xml中找不到,请检查"); } return actionMapping; } // 初始化allActions集合 private void init() { try { // 1. 得到解析器 SAXReader reader = new SAXReader(); // 得到src/mystruts.xml 文件流 InputStream inStream = this.getClass().getResourceAsStream("/mystruts.xml"); // 2. 加载文件 Document doc = reader.read(inStream); // 3. 获取根 Element root = doc.getRootElement(); // 4. 得到package节点 Element ele_package = root.element("package"); // 5. 得到package节点下, 所有的action子节点 List<Element> listAction = ele_package.elements("action"); // 6.遍历 ,封装 for (Element ele_action : listAction) { // 6.1 封装一个ActionMapping对象 ActionMapping actionMapping = new ActionMapping(); actionMapping.setName(ele_action.attributeValue("name")); actionMapping.setClassName(ele_action.attributeValue("class")); actionMapping.setMethod(ele_action.attributeValue("method")); // 6.2 封装当前aciton节点下所有的结果视图 Map<String,Result> results = new HashMap<String, Result>(); // 得到当前action节点下所有的result子节点 Iterator<Element> it = ele_action.elementIterator("result"); while (it.hasNext()) { // 当前迭代的每一个元素都是 <result...> Element ele_result = it.next(); // 封装对象 Result res = new Result(); res.setName(ele_result.attributeValue("name")); res.setType(ele_result.attributeValue("type")); res.setPage(ele_result.getTextTrim()); // 添加到集合 results.put(res.getName(), res); } // 设置到actionMapping中 actionMapping.setResults(results); // 6.x actionMapping添加到map集合 allActions.put(actionMapping.getName(), actionMapping); } } catch (Exception e) { throw new RuntimeException("启动时候初始化错误",e); } }}package com.chinano1edu.com.framework.bean;import java.util.Map;/** * 封装action节点 */public class ActionMapping { // 请求路径名称 private String name; // 处理aciton类的全名 private String className; // 处理方法 private String method; // 结果视图集合 private Map<String,Result> results; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Map<String, Result> getResults() { return results; } public void setResults(Map<String, Result> results) { this.results = results; }}package com.chinano1edu.com.framework.bean;/** * 封装结果视图 */public class Result { // 跳转的结果标记 private String name; // 跳转类型,默认为转发; "redirect"为重定向 private String type; // 跳转的页面 private String page; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } }
4).Action代码
package com.chinano1edu.framework.action;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.chinano1edu.entity.User;import com.chinano1edu.service.UserService;/** * Action表示动作类 1. 一个servlet对应一个action 2. action中负责处理具体的请求 */public class LoginAction { public Object execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { return null; } /** * 处理登陆请求 */ public Object login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object uri = null; // 1. 获取请求数据,封装 String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); User user = new User(); user.setName(name); user.setPwd(pwd); // 2. 调用Service UserService userService = new UserService(); User userInfo = userService.login(user); // 3. 跳转 if (userInfo == null) { // 登陆失败 uri = "loginFaild"; // loginFaild = /login.jsp } else { // 登陆成功 request.getSession().setAttribute("userInfo", userInfo); // 首页 uri = "loginSuccess"; } return uri; }}package com.chinano1edu.framework.action;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.chinano1edu.entity.User;import com.chinano1edu.service.UserService;public class RegisterAction { public Object register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object uri; // 1. 获取请求数据,封装 String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); User user = new User(); user.setName(name); user.setPwd(pwd); // 2. 调用Service UserService userService = new UserService(); userService.register(user); // 3. 跳转 return "registerSuccess"; }}
5).Service层代码
public class UserService { private UserDao ud = new UserDao(); // 模拟登陆 public User login(User user){ return ud.login(user); } // 模拟注册 public void register(User user) { ud.register(user); }}
6).userBean层代码
public class User { private String name; private String pwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; }}
7).Dao层代码
public class UserDao { // 模拟登陆 public User login(User user){ if ("tom".equals(user.getName()) && "888".equals(user.getPwd()) ){ return user; } return null; } public void register(User user) { System.out.println("注册成功:用户," + user.getName()); }}
8).web.xml文件代码
<?xml version="1.0" encoding="UTF-8"?><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>ActionServlet</servlet-name> <servlet-class>com.chinano1edu.framework.ActionServlet</servlet-class> <!-- 启动时候执行servlet初始化方法 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
9).jsp文件代码
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>index</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 欢迎你,${sessionScope.userInfo.name } </body></html>
2.login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>login</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="${pageContext.request.contextPath }/login.action" name="frmLogin" method="post"> 用户名: <input type="text" name="name"> <br/> 密码: <input type="text" name="pwd"> <br/> <input type="submit" value="登陆"> <br/> </form> </body></html>
3.register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>login</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="${pageContext.request.contextPath }/register.action" name="frmRegister" method="post"> 用户名: <input type="text" name="name"> <br/> 密码: <input type="text" name="pwd"> <br/> <input type="submit" value="注册"> <br/> </form> </body></html>
阅读全文
0 0
- 基于MVC模式封装一个自己的Structs案例
- 封装一个自己的mvc框架
- 基于自己封装的微信api操作案例
- 自己封装的一个基于ios的一个折叠tableView
- 如何封装一个自己的mvc框架(一)
- 如何封装一个自己的mvc框架(二)
- 如何封装一个自己的mvc框架(三)
- 封装一个属于自己的mvc框架(1)
- 如何封装一个自己的mvc框架(四)
- 如何封装一个自己的mvc框架(五)
- 如何封装一个自己的mvc框架(六)
- 封装一个属于自己的mvc框架(2)
- 如何封装一个自己的mvc框架(七)
- 封装一个属于自己的mvc框架(3)
- 封装自己的mvc 框架
- 封装一个适合自己的AutoLayout(基于鸿洋AutoLayout)
- structs实现的MVC结构
- 构建一个简单的基于MVC模式的JavaWeb
- 机房收费系统之日历控件
- IntelliJ IDEA 缓存和索引介绍和清理方法
- SSL P1597 石子合并问题 题目
- 关于冒泡法的一些问题
- 基于Unity3D的JSON文件的存储的实现
- 基于MVC模式封装一个自己的Structs案例
- 变量的伟大
- Linux-块设备-数据结构
- 你对IT风投了解多少?
- 172. Factorial Trailing Zeroes
- 基于ES6的缩放元素的插件
- 全景拼接代码
- java 结构性模式(七种)
- 基于SSM框架实现基本文件操作