java EE开发之Servlet第八课:MVC模式 (基本理解)

##1,为什么需要MVC模式?
为什么需要MVC模式,以前简单的JSP页面处理不好吗?MVC有什么好处呢?
答:MVC就是常说的:

  • 模型(Model):POJO(Plain Old Java Object普通类)
  • 视图(View):Jsp
  • 控制Controller):Servlet Filter

它把业务处理和Jsp页面分开了。而以前的Jsp页面是把所有的代码都写在Jsp 页面中,那样不利于维护,MVC模式的目的就是实现Web系统的职能分工。
####MVC模式的好处:
#####1.各施其职,互不干涉
   在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生 了变化,就只需要更改相应的层中的代码而不会影响到其它层中的
代码。
#####2.有利于开发中的分工
在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中
的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开
发人员可开发业务层,而其它开发人员可开发控制层。
#####3.有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件, 视图层也可做成通用的操作界面。

##2.MVC的基本原理是怎样的呢?
每个层之间的关系又是怎样的,它们是怎样执行的?
答:基本原理是:
这里写图片描述

每一步代表的意思是:
#####1,jsp页面,通过请求到配置文件中然后到Struts2Filter
#####2,a,在Struts2Filter中 通过页面的请求Action=“XXX.action”

//获得要请求的路径 打印uri的结果是 :/MVCTest1/reg.action
String uri=request.getRequestURI();
//获得请求的文件名:打印requstname 的结果是:reg.action
String reqeustname=uri.substring(uri.indexOf("/",1)+1);
//通过要请求的文件名到属性文件中去找相对应的类的名称
String classname= ps.getProperty(reqeustname);

#####3,返回一个相对应的类的名称

//去CLASS类中找类名为 classname的类
Class c=Class.forName(classname);
//找到后再调Class类的构造方法
Object obj=c.newInstance();
//因为obj是实现了Action接口的,所以
Action action=(Action)obj;

#####4,找到类后再去调类中的方法,

//然后再调Action中的execute方法  返回一个String字符串
String result = action.execute(request, response);
action.execute(request, response);//主要是用来调用Dao层的方法的

#####**5,因为类都实现了Action的接口,所以再第三步中可以中接口来作为类型 **

//接口是一个业务员要工作的一组规范
//参数是:请求对象 和响应对象
//返回是:String 最终页面跳转的路径
public String execute(HttpServletRequest 	 
	request,HttpServletResponse response)throws Exception;

#####6,因为方法的返回类型是 String对象,这个字符串代表的就是最终跳转的和页面,但是有一个问题,就是跳转的方式有重定向和转发这里,我们不做判断,默认就用转发

//重定向:通过request.getContextPath()得到上下文路response.sendRedirect(request.getContextPath()+"/"+path);

//转发			request.getRequestDispatcher("/"+path).forward(request, response);

##3.具体实现
(1)开发一个Struts2Filter(公司),要求能够接收所有的.action请求。(即配置web.xml文件达到要求)

public class Struts2Filter implements Filter{
	public void destroy() {
	}
	
........
	public void doFilter(ServletRequest req, 
		ServletResponse res,FilterChain chain) 
		throws IOException, ServletException {
		
		
				
	}

	

}

(2)开发一个业务员的接口Action接口,要求定义一个行为,即execute方法,传入请求与响应对象,返回一个结果页面的jsp文件名。

public class MaleAction implements Action {

	public String execute(HttpServletRequest 
				request,HttpServletResponse response) {
		String uname = request.getParameter("uname");
		request.setAttribute("uname", uname);
		
		System.out.println(uname+"你好,刘教授为你看病...");
		return "maleOk.jsp";
	}
}

(3)在WEB-INF目录上加一个属性文件,文件名:actionConfig.properties,此文件是一个注册了请求的URI与业务员类的对应关系。

#资源文件
#男科 = 专家刘教授
#内科 = 主任孙教授

male.do = com.kz.action.MaleAction
#female.do = com.accp.action.FemaleAction
query.do = com.kz.action.QueryAction
del.do = com.kz.action.DelAction

(4)在Struts2Filter类的init方法中将属性文件actionConfig.properties文件内容加载到一个属性对象中。

public void init(FilterConfig filterConfig) throws 	   
					ServletException {
		//读取本地资源配置文件
		InputStream is =filterConfig.
						getServletContext().
						getResourceAsStream("/WEB-
						INF/config.properties");
		//把配置文件读入到内存中
		ps = new Properties();
		try {
			ps.load(is);
			//关闭
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

(5)在Struts2Filter的服务方法首先对所有的请求参数进行编码。

//System.out.println("访问到了ActionServlet");
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
request.setCharacterEncoding("utf-8");

(6)在Struts2Filter的服务方法中根据请求的URI得到对应的业务员对象。

//1.获取客户端收送的请求类型(具体的请求信息:male.action
//							female.action ....)
//    /mvc/male.action
String uri = request.getRequestURI();
//巧用文件对象,获取具体的male.action
File file = new File(uri);
String type = file.getName();
System.out.println(type);

//2.根据请求类型,找到对应的负责处理请求的类
//发出的是一个看男科的请求,就需要找到对应的男科医生
String className = ps.getProperty(type);
if(className!=null){
		//根据具体的类名,获取其Class类型的对象
		Class c =  Class.forName(className);
		//根据 c对象,创建其具体的Action
		Action action =  (Action)c.newInstance();
}

(7)在Struts2Filter的服务方法中得到业务员对象后,调用业务员execute方法,开始工作,并接收业务员返回的结果页面的jsp文件名,在Struts2Filter的服务方法中接收到业务员返回的结果页面jsp名字后后,将页面转发或者是重定向到结果页面去。

//调用action的执行方法(看病的行为,会有一个结果返回)
try{
	String url = action.execute(request,
									response);
	//根据结果,执行页面的跳转(默认是转发)
	request.getRequestDispatcher(url).forward(										          	  
				          request, response);
	//放行---在最后放行
	if(url==null){
		chain.doFilter(request, response);
	}else{
		return ;
	}

遗留问题:不能确定设置重定向或者转发?


超全面的测试IT技术课程,0元立即加入学习!有需要的朋友戳:

腾讯课堂测试技术学习地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值