安装+java+mvc_用JSP+Servlet+JavaBean实现MVC设计模式的流程

MVC是三个单词的缩写:M,Model(模型);V,View( 视图 ),C,Control(控制)。

MVC模式的目的就是实现Web系统的职能分工,

Model层:实现系统的业务逻辑,即javaBean部分

View层:负责与用户交互,即在界面上展示数据对象给用户,即html,jsp

Control层:Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作,当然就是Servlet的职责了

下面我们用MVC设计模式来实现 简单的用户登录过程

1、控制器Servlet的实现

系统中只有一个servlet即ControlServlet,所有页面发起的以"  *.do  "的请求,都被web.xml配置给ControlServlet进行处理,在ControlServlet中根据‘ * ’的字符串(即解析用户请求的路径),调用ActionFactory生成的制定Action对象,在将处理后的URL转发给用户。

Java代码 packagecn.netjava.servlet;

importjava.io.IOException;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importcn.netjava.action.Action;

importcn.netjava.action.ActionFactory;

/**

* Servlet implementation class ControlServlet

*/

publicclassControlServletextendsHttpServlet {

privatestaticfinallongserialVersionUID = 1L;

protectedvoidservice(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

//得到当前Servlet的请求路径

String pathName =request.getServletPath();

// request.getContextPath();得到项目名字

System.out.println("pathName:"+pathName);

//得到请求的Action名字

intindex = pathName.indexOf(".");

String ActionName = pathName.substring(1, index);

System.out.println(ActionName);

//获取运行时参数

String ActionClassName =this.getInitParameter(ActionName);

//得到Action对象

Action action = ActionFactory.getActionFactory().getAction(ActionClassName);

//执行Action的execute得到要返回的URL路径

String url = action.execute(request, response);

if(url==null){

request.getRequestDispatcher("error.jsp").forward(request, response);

}else{

request.getRequestDispatcher(url).forward(request, response);

}

}

}

package cn.netjava.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import cn.netjava.action.Action;

import cn.netjava.action.ActionFactory;

/**

* Servlet implementation class ControlServlet

*/

public class ControlServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//得到当前Servlet的请求路径

String pathName =request.getServletPath();

// request.getContextPath();得到项目名字

System.out.println("pathName:"+pathName);

//得到请求的Action名字

int index = pathName.indexOf(".");

String ActionName = pathName.substring(1, index);

System.out.println(ActionName);

//获取运行时参数

String ActionClassName = this.getInitParameter(ActionName);

//得到Action对象

Action action = ActionFactory.getActionFactory().getAction(ActionClassName);

//执行Action的execute得到要返回的URL路径

String url = action.execute(request, response);

if(url==null){

request.getRequestDispatcher("error.jsp").forward(request, response);

}else{

request.getRequestDispatcher(url).forward(request, response);

}

}

}

2、Action对象工厂类实现:

ActionFactory是一个单实例类(整个系统只需要使用其一个对象),它只提供一个Action对象,通过getAction(String ActionClassName) 的方法调用创建一个Action对象。这个方法在Control中被调用。代码如下:

Java代码 icon_copy.gif icon_star.png

spinner.gif

packagecn.netjava.action;

/**

* 根据Action名字,创建Action对象

* @author Administrator

*

*/

publicclassActionFactory {

//单例模式:不需要创建对象

privateActionFactory(){

}

//单实例访问方法,得到ActionFactory对象

publicstaticActionFactory getActionFactory(){

if(af ==null){

af =newActionFactory();

}

returnaf;

}

/**

* 根据具体的Action类名字创建Action对象

* @param ActionClassName :具体的Action类全名

* @return:Action类型对象

*/

publicAction getAction(String ActionClassName){

Action action =null;

try{

action = (Action) Class.forName(ActionClassName).newInstance();

}catch(Exception e){

e.printStackTrace();

}

returnaction;

}

privatestaticActionFactory af;

}

package cn.netjava.action;

/**

* 根据Action名字,创建Action对象

* @author Administrator

*

*/

public class ActionFactory {

//单例模式:不需要创建对象

private ActionFactory(){

}

//单实例访问方法,得到ActionFactory对象

public static ActionFactory getActionFactory(){

if(af == null){

af = new ActionFactory();

}

return af;

}

/**

* 根据具体的Action类名字创建Action对象

* @param ActionClassName :具体的Action类全名

* @return:Action类型对象

*/

public Action getAction(String ActionClassName){

Action action = null;

try{

action = (Action) Class.forName(ActionClassName).newInstance();

}catch(Exception e){

e.printStackTrace();

}

return action;

}

private static ActionFactory af;

}

3、Action接口类定义:

所有的事件处理(即Action)类都必须实现这个接口

Java代码 icon_copy.gif icon_star.png

spinner.gif

packagecn.netjava.action;

publicinterfaceAction {

/**

* 所有的具体Action实现这个接口

* @param request 请求对象

* @param response 应答对象

* @return :结果页面

*/

publicString execute(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response);

}

package cn.netjava.action;

public interface Action {

/**

* 所有的具体Action实现这个接口

* @param request 请求对象

* @param response 应答对象

* @return :结果页面

*/

public String execute(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response);

}

4、web.xml中配置请求发送给控制器Servlet

最后,我们只需要在wex.xml中对MVC结构的配置:

视图页面中的请求都是以.do结尾,当这个请求到达web服务器后,会被服务器转向给控制器处理,控制器在根据解析出的动作名,调用对应的Action对象,处理结果,并输出结果页面,所以web.xml中必须有如下配置:

Java代码 icon_copy.gif icon_star.png

spinner.gif

controlServlet

cn.netjava.servlet.ControlServlet

loginAction

cn.netjava.action.LoginAction

controlServlet

*.do

controlServlet

cn.netjava.servlet.ControlServlet

loginAction

cn.netjava.action.LoginAction

controlServlet

*.do

4、具体的Action类实现(即对登录动作进行处理的类)

Java代码 icon_copy.gif icon_star.png

spinner.gif

packagecn.netjava.action;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

publicclassLoginActionimplementsAction {

publicString execute(HttpServletRequest request,

HttpServletResponse response) {

// 得到用户名和密码

String userName = request.getParameter("userName");

String userPwd = request.getParameter("userPwd");

if(userName.equals("netjava") && userPwd.equals("netjava")) {

request.setAttribute("userName", userName);

return"main.jsp";

}else{

return"login.jsp";

}

}

}

package cn.netjava.action;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class LoginAction implements Action {

public String execute(HttpServletRequest request,

HttpServletResponse response) {

// 得到用户名和密码

String userName = request.getParameter("userName");

String userPwd = request.getParameter("userPwd");

if (userName.equals("netjava") && userPwd.equals("netjava")) {

request.setAttribute("userName", userName);

return "main.jsp";

} else {

return "login.jsp";

}

}

}

如果登录成功,跳转到 main.jsp页面,否则,返回login,jsp页面

以下是main.jsp和login.jsp页面:

main.jsp

Html代码 icon_copy.gif icon_star.png

spinner.gif

pageEncoding="utf-8"%>

html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

Insert title here

登录成功

pageEncoding="utf-8"%>

Insert title here

登录成功

login.jsp

Html代码 icon_copy.gif icon_star.png

spinner.gif

pageEncoding="utf-8"%>

html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

用户登录

用户名:

密码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值