自定义MVC
1、什么是MVC框架?
MVC是一种设计模式
结构:
2、自定义mvc的作用
自定义mvc框架可以实现MVC框架的分层,且在新增业务逻辑是更容易修改代码,实现低耦合。
3、简单代码实现
登录界面 login.jsp
- <body>
- <h1>登录界面</h1>
- <form action="login.do" method="post">
- 用户名:<input type="text" name="uname"/><br/>
- 密码: <input type="password" name="upass"/><br/>
- <input type="submit" value="登录"/><br/>
- </form>
- </body>
- package com.sun.servlet;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Enumeration;
- import java.util.Properties;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.sun.form.TotalForm;
- import com.sun.servletDo.Jump;
- import com.sun.servletDo.TotalDo;
- public class TotalServlet extends HttpServlet{
- @Override
- public void init(ServletConfig config) throws ServletException {
- //3.加载配置文件
- Properties properties=new Properties();
- Properties propertiesObject=new Properties();
- FileInputStream fis;
- try {
- //获取服务器请求路径
- String serverPath=config.getServletContext().getRealPath("/");
- fis = new FileInputStream(serverPath+"WEB-INF/config.properties");
- properties.load(fis);
- //将properties存放在application中
- config.getServletContext().setAttribute("properties", properties);
- config.getServletContext().setAttribute("propertiesObject", propertiesObject);
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- //1.获取请求路径
- String uri=req.getRequestURI();
- //2.截取
- int star=uri.lastIndexOf("/");
- int end=uri.lastIndexOf(".");
- uri=uri.substring(star+1, end);
- System.out.println("截取后的URI为:"+uri);
- //从application中获取properties
- Properties properties=(Properties) req.getSession().getServletContext().getAttribute("properties");
- Properties propertiesObject=(Properties) req.getSession().getServletContext().getAttribute("propertiesObject");
- //根据键获取值
- String className=properties.getProperty(uri);
- System.out.println("获取的全限定名为:"+className);
- TotalDo totalDo=(TotalDo) propertiesObject.get(className);
- //根据类的全限定名来实例化该对象
- try {
- if(totalDo==null){
- System.out.println("初始化");
- totalDo=(TotalDo) Class.forName(className).newInstance();
- propertiesObject.put(className, totalDo);
- }
- //获取表单的值,给了LoginForm
- //获取表单上所有的参数名
- String classNameForm=properties.getProperty(uri+"Form");
- System.out.println("c:"+classNameForm);
- Class clazzForm=Class.forName(classNameForm);
- TotalForm totalForm=(TotalForm) clazzForm.newInstance();
- //获取所有参数
- Enumeration enumeration=req.getParameterNames();
- while(enumeration.hasMoreElements()){
- //参数名
- String paramName=(String) enumeration.nextElement();
- //值
- String paramValue=req.getParameter(paramName);
- //利用反射技术获取LoginFrom中所有的set方法
- //拼接方法名
- String methodName="set"+paramName.substring(0, 1).toUpperCase()+paramName.substring(1);
- Method method=clazzForm.getDeclaredMethod(methodName, String.class);
- //设置可访问
- method.setAccessible(true);
- //执行方法
- method.invoke(totalForm, paramValue);
- }
- Jump jump=totalDo.execute(totalForm);
- jump.jumpPage(req, resp);
- //totalDo.execute();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
具体业务逻辑总接口 TotalDo.java
- package com.sun.servletDo;
- import com.sun.form.TotalForm;
- public interface TotalDo {
- public Jump execute(TotalForm totalForm);
- }
登录业务逻辑 loginDO.Java
- package com.sun.servletDo;
- import com.sun.form.LoginForm;
- import com.sun.form.TotalForm;
- public class LoginDo implements TotalDo{
- public Jump execute(TotalForm totalForm) {
- LoginForm loginForm=(LoginForm) totalForm;
- System.out.println(loginForm.toString());
- System.out.println("执行登录的业务逻辑");
- return new Jump("index.jsp", true);
- }
- }
页面跳转处理类 Jump.java
- package com.sun.servletDo;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * 页面跳转处理类
- * @author 尹日成
- *
- */
- public class Jump {
- private String url; //跳转到哪里去
- private boolean b; //是否为重定向
- public Jump(String url, boolean b) {
- this.url = url;
- this.b = b;
- }
- public Jump() {
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public boolean isB() {
- return b;
- }
- public void setB(boolean b) {
- this.b = b;
- }
- public void jumpPage(HttpServletRequest req, HttpServletResponse resp){
- try {
- //判断重定向
- if(b){
- resp.sendRedirect(url);
- }else{
- req.getRequestDispatcher(url).forward(req, resp);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ServletException e) {
- e.printStackTrace();
- }
- }
- }
表单处理父类 TotalForm.java
- package com.sun.form;
- public class TotalForm {
- }
登录表单 LoginForm.java
- package com.sun.form;
- public class LoginForm extends TotalForm{
- private String uname;
- private String upass;
- public LoginForm(){
- }
- public LoginForm(String uname, String upass) {
- super();
- this.uname = uname;
- this.upass = upass;
- }
- public String getUname() {
- return uname;
- }
- public void setUname(String uname) {
- this.uname = uname;
- }
- public String getUpass() {
- return upass;
- }
- public void setUpass(String upass) {
- this.upass = upass;
- }
- @Override
- public String toString() {
- return "LoginForm [uname=" + uname + ", upass=" + upass + "]";
- }
- }
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">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>totalServlet</servlet-name>
- <servlet-class>com.sun.servlet.TotalServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>totalServlet</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- </web-app>
配置文件 config.properties
- login=com.sun.servletDo.LoginDo
- loginForm=com.sun.form.LoginForm
注意:1、界面表格参数与表实体类和实体类必须保持一致
2、文章中未写到的entity util 和biz、dao 还保持一样 如下图: