您的位置:首页 > 编程语言 > Java开发

一口一口吃掉Struts(一)——用JSP+Servlet演示Struts的基本原理 .

2014-03-24 15:58 274 查看
struts是开源项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC的应用框架。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。

MVC即Model-View-Controller的缩写,是一种常用的设计模式(具体自己百度吧)

我们用JSP+Servlet实现“一个应用的增改信息”,先来看一下,如果没有Struts,我们一般都是怎么做的。
废话少说,果断上代码





V层
用JSP实现

[html]
view plaincopyprint?

<body>
<a href="Servlet/Add.action">测试增加》》》》》》》》》》</a>
<a href="Servlet/Modify.action">测试修改》》》》》》》》》》</a>
</body>

<body>
<a href="Servlet/Add.action">测试增加》》》》》》》》》》</a>
<a href="Servlet/Modify.action">测试修改》》》》》》》》》》</a>
</body>



C层
前端控制器Servlet

[java]
view plaincopyprint?

package Control;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Controller extends HttpServlet {

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

//截取字符串
String requestURI=request.getRequestURI();
String flagAction = requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));

IAction action =null;

//根据字符串转发相应的Action
if("/Servlet/Add".equals(flagAction))
{
//TODO 采用读取配置文件,反射,这里省略,就直接NEW了

action=new AddAction();
}else if("/Servlet/Modify".equals(flagAction))
{
action =new ModifyAction();
}

//TODO 获取表单信息
//TODO 将字符串转换为我们需要的格式等等,向下传递


//得到转向信息
String forwordString=action.Excute();

//转发
request.getRequestDispatcher(forwordString).forward(request, response);


}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}

}

package Control;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Controller extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//截取字符串
		String requestURI=request.getRequestURI();
		String flagAction = requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));
		
		IAction action =null;
		
		//根据字符串转发相应的Action
		if("/Servlet/Add".equals(flagAction))
		{
			//TODO 采用读取配置文件,反射,这里省略,就直接NEW了
			action=new AddAction(); 
		}else if("/Servlet/Modify".equals(flagAction))
		{
			action =new ModifyAction();
		}
		
		//TODO 获取表单信息
		//TODO 将字符串转换为我们需要的格式等等,向下传递
		
		//得到转向信息
		String forwordString=action.Excute();
		
		//转发
		request.getRequestDispatcher(forwordString).forward(request, response);
		
	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}

}


配置文件

[html]
view plaincopyprint?

<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>Control.Controller</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

<servlet>
		<servlet-name>Controller</servlet-name>
		<servlet-class>Control.Controller</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>Controller</servlet-name>
	    <url-pattern>*.action</url-pattern>
	</servlet-mapping>



Actoin接口和实现Action接口的增和改

[java]
view plaincopyprint?

package Control;

public interface IAction {
public String Excute();
}

package Control;

public interface IAction {
	public String Excute();
}




[java]
view plaincopyprint?

package Control;

import Model.Manage;

public class AddAction implements IAction {

public String Excute() {
//执行MODEL层逻辑
Manage manage=new Manage();
manage.Add();

//返回转向信息
// TODO 可以在配置文件中读

return "/AddSuccess.jsp";
}
}

package Control;

import Model.Manage;

public class AddAction implements IAction {

	public String Excute() {
		//执行MODEL层逻辑
		Manage manage=new Manage();
		manage.Add();
		
		//返回转向信息
		// TODO 可以在配置文件中读
		return "/AddSuccess.jsp";
	}
}




[java]
view plaincopyprint?

package Control;

import Model.Manage;

public class ModifyAction implements IAction {

public String Excute() {
//执行MODEL层逻辑
Manage manage=new Manage();
manage.Modify();

//返回转向信息
//TODO 可以在配置文件中读

return "/ModifySuccess.jsp";
}

}

package Control;

import Model.Manage;

public class ModifyAction implements IAction {

	public String Excute() {
		//执行MODEL层逻辑
		Manage manage=new Manage();
		manage.Modify();
		
		//返回转向信息
		//TODO 可以在配置文件中读
		return "/ModifySuccess.jsp";
	}

}



M层
实现业务逻辑

[java]
view plaincopyprint?

package Model;

public class Manage {
public void Add()
{
System.out.println("添加》》》》");
}

public void Modify()
{
System.out.println("更改》》》》");
}
}

package Model;

public class Manage {
	public void Add()
	{
		System.out.println("添加》》》》");
	}
	
	public void Modify()
	{
		System.out.println("更改》》》》");
	}
}



我们这么实现会有哪些问题?

1、实例化响应的Action,我们要么用if语句,手动创建,要么需要自己读配置文件,获取Action,反射实例化
2、表单过来的所有数据都是字符串,我们需要手动转成响应的格式
3、转向信息,我们可能会写死,也可能手动去配置文件读
4、……
我们需要手动做很多事,而且很多重复劳动,还容易出错。

如果有个东西能为我代劳就简单得多了,所以Struts应运而生,Struts把我们上面提到的那些都做了封装,让我们的开发更高效,更有灵活性。上面的代码,用时序图表示如下,我们完全可以看做是Struts实现地基本原理。



这篇先说这么多,下篇继续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: