简易MVC

准备工作:

可能需要的文件:

①(action包)、

其中A文件(是一个接口)的作用就是方便selrvlet调用其实现类的action,里面只有一个方法;

Action.java文件就是action了通过实现A这个接口来完成action的任务;

ForWard.java文件就是一个实现了action工作之后需要跳转的类,里面有两个属性和一个方法(属性:跳转的位置,跳转方式。方法:跳转的方法);

②(dao包)

里面只有一个ObjDao.java,这个类是负责数据库操作的类。主要功能就是用户和数据库的数据交互;

③(servlet包)

ActionServlet.java类是一个负责接收关于action的请求出来的类;

④(config.xml)

而这个文件就比较重要了,它的主要作用就是负责把serlvet和acton连接(告诉servlet具体的请求哪个action);

代码如下:

public class Action implements A{
    //实现A接口的方法
	@Override
	public ForWard test(HttpServletRequest req, HttpServletResponse resp) {
        //因为实体类的名字和表保持一致(实体类和表字段保持一致)

		Student s=new Student();
		//调用ObjDao方法获取表中的所有数据
		List<Student> selectAll = ObjDao.selectAll(s);
        //将所有数据保存到请求对象中
		req.setAttribute("list", selectAll);
		//通过跳转类返回给servlet
		return new ForWard("NewFile.jsp",true);
	}
	
}
public class ForWard {
	//需要跳转的页面名字
	private String pageName;
    //跳转的方式Request或者Response
	private boolean isReq;
	
	
    public ForWard(String pageName, boolean isReq) {
        super();
        this.pageName = pageName;
        this.isReq = isReq;
    }
	

    //跳转的方法通过判断isReq
	public void forward(HttpServletRequest req, HttpServletResponse resp){
		
			try {
				if (isReq) {
					req.getRequestDispatcher(pageName).forward(req, resp);
				}else {
					resp.sendRedirect(pageName);
				}
			} catch (ServletException | IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
	}
	
}
public class ObjDao {
	
    //获取Connection方法省...
    

    //关闭资源方法省...	


    //通过反射写一个查询所有的表(适用大部分表)
	public static List selectAll(Object obj){
		List list=new ArrayList<>();
		Class<? extends Object> c = obj.getClass();
		try {
			
			String sql="select * from "+c.getSimpleName();
			//获取所有属性
			Field[] fields = c.getDeclaredFields();
			Field.setAccessible(fields, true);
			Connection con = getCon();
			PreparedStatement st = con.prepareStatement(sql);
			ResultSet rs = st.executeQuery();
			
			while(rs.next()){
                //通过类对象实例对象
				Object newInstance = c.newInstance();
				for (int i = 0; i < fields.length; i++) {
                    //通过属性的名字取出数据库的只在给属性赋值
					fields[i].set(newInstance, rs.getObject(fields[i].getName()));
				}
				list.add(newInstance);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
}
public class ActionServlet extends HttpServlet{
	
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的路径
		String uri = req.getRequestURI();
        //截取请求路径判断请求action
		String name=uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));
		
		String path = map.get(name);
        
		try {
            //通过全限定名得到类对象
			Class<?> forName = Class.forName(path);
            //A是所有action的实现接口所以A算是action的父亲
			A a = (A)forName.newInstance();
            //通过多态思想调用方法,返回调转对象
			ForWard test = a.test(req,resp);
            //跳转页面
			test.forward(req, resp);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	//让action都上班(初始所有action的全限定名)
	Map<String, String> map=new HashMap<>();
	@Override
	public void init() throws ServletException {
		 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//得到创建 DOM 解析器的工厂。  
	     DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			Document document = builder.parse(this.getServletContext().getResourceAsStream("WEB-INF/config.xml")); //得到代表整个文档的 Document 对象
			Element e = document.getDocumentElement();
			NodeList eList = e.getElementsByTagName("action");
			for (int i = 0; i < eList.getLength(); i++) {
				 Element element = (Element) eList.item(i);
				 map.put(element.getAttribute("name"), element.getAttribute("class"));
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
	
}

<?xml version="1.0" encoding="UTF-8"?>
<actions>
	<!-- 
		name:请求的名字
		class:action的全限定名
	 -->
	<action name="action" class="com.xb.action.Action" ></action>
</actions>
<!-- servlet的配置 -->
<servlet>
  	<servlet-name>ActionServlet</servlet-name>
  	<servlet-class>com.xb.serlvet.ActionServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>ActionServlet</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

最后启动服务查看成果:

发布了15 篇原创文章 · 获赞 0 · 访问量 223

猜你喜欢

转载自blog.csdn.net/qq_42825101/article/details/95175698