##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元立即加入学习!有需要的朋友戳:
腾讯课堂测试技术学习地址