Java Web MVC模式个人学习理解

由于接了一个小项目,于是边做边学了一段时间的Java Web。在很长一段时间里都不能理解Java Web的运行模式,Servlet究竟是做什么?JSP与servlet的关系是什么?知道学到了MVC,项目开始基本运作的时候,才自认为理解了Java web的运作流程,下面将我的理解与大家分享一下。

MVC指的是M:Model、V:View、C:Controller这三个部分。这三部分分别对应Java web中三个不同的重要组成部分。Model即模型,代表后台的业务逻辑和数据对象,通常由JavaBean和POJO组成。其作用是进行后台相关业务逻辑(如数据库的操作等)的操作和作为数据的载体。下面给出几个简单的Model模型:

public class pojo{
	
	private int Year;
	private float Count;

        public int getYear() {
		return Year;
	}

	public void setYear(int year) {
		Year = year;
	}

	public float getnCount() {
		return Count;
	}

	public void setnCount(float Count) {
		this.Count= Count;
	}
这是一个pojo,用来存储数据库中的数据,方便数据操作。

public class BaseDAO implements DAO {

	public BaseDAO() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public Connection getConnetion() throws DAOException {
		// TODO Auto-generated method stub
		DataSource dataSource = DataSourceCache.getInstance().getDataSource();
		try
		{
			return dataSource.getConnection();
		}
		catch(Exception e)
		{
			throw new DAOException();
		}
	}
	
	protected void closeDBObjects(ResultSet resultSet,Statement statement,Connection connection)
	{
		if(resultSet != null)
		{
			try
			{
				resultSet.close();
			}
			catch(Exception e){}
		}
		if(statement != null)
		{
			try
			{
				statement.close();
			}
			catch(Exception e){}
		}
		if(connection != null)
		{
			try
			{
				connection.close();
			}
			catch(Exception e){}
		}
	}
}
这是一段DAO的代码,DAO即数据DATA Access Object,是一种面向数据库对象接口。Java开发者可以直接使用它进行数据库的访问。DAO也属于Model,用于进行数据库的操作。

View指的是视图,Java web的视图可想而知,就是JSP页面。我们知道,过去我们编写JSP页面需要通过servlet来编写,相当的费事。现在编写JSP页面可直接在html中插入JSP脚本或el表达式来实现,JSP页面在部署到服务器后,用户第一次访问会将JSP解释成servlet来运行。不过对于JSP页面没有太多深入的话题,到此为止。

最后一个Controller指控制器,也就是Servlet。之前一直不知道Servlet充当着控制器的角色。当一个Servlet部署了的UrlPattern后,用户请求的url中的Uri是包含在UrlPattern中(我只能如此来描述了,至于用词的对错没有细心考证),那么请求将会先进入部署了包含这个Uri的UrlPattern的Servlet,在这个Servlet中对这个请求进行操作(操作自定义,一般是将请求forward到不同的页面)。那么这个Servlet充当的就是控制器的角色。也许这么说不太清楚,下面给个Servlet的部分代码(自己项目的,代码写得比较渣勿吐槽 = =):

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jasper.tagplugins.jstl.core.Redirect;



/**
 * Servlet implementation class crmServlet
 */
@WebServlet(name = "crmServlet", urlPatterns = {
		"/CRMDataSave","/CRMDataGet","/CRMChartDataGet"})  /*部署的url,在web.xml中也可以部署<span style="font-family: Arial, Helvetica, sans-serif;">我们请求的url后跟/CRMDataSave、/CRMDataGet、/CRMChartDataGet</span><span style="font-family: Arial, Helvetica, sans-serif;">都会进入这个控制器  */</span><pre code_snippet_id="404981" snippet_file_name="blog_20140624_5_2238105" name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">public class crmServlet extends HttpServlet {</span>
 
<span style="white-space:pre">	</span>private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    <span style="white-space:pre">	</span>public crmServlet() {
       <span style="white-space:pre">		</span>super();
       <span style="white-space:pre">		</span>// TODO Auto-generated constructor stub
    <span style="white-space:pre">	</span>}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		process(request, response);          <span style="white-space:pre">	</span>//get和post请求都执行process函数
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		process(request, response);
	}
	
	protected void process(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
		String szUri = request.getRequestURI();<span style="white-space:pre">				</span>//获取uri
		int iLastIndex = szUri.lastIndexOf("/");
		String szAction = szUri.substring(iLastIndex+1);
		
		if(szAction.isEmpty())
		{
			String disPatchUrl = "/index.jsp";
			RequestDispatcher rd = request.getRequestDispatcher(disPatchUrl);
			rd.forward(request, response);
		}
		else if(szAction.equals("CRMChartDataGet"))<span style="white-space:pre">			</span>//判断不同的Uri执行不同的操作
		{
			List<crmDataObject> dataObjList = new ArrayList<crmDataObject>();
			crmDataObject dataObj = new crmDataObject();
			int Year = Integer.parseInt(request.getParameter("year"));
			crmDataGetAction dataGet = new crmDataGetAction();
			String responseText = "";
			//List<String> responseTextList = new ArrayList<String>();
			dataObjList = dataGet.getData(Year);
			for(int i = 0;i<dataObjList.size();i++)
			{
				dataObj = dataObjList.get(i);
				//responseText += Float.toString(dataObj.getnAnnualCount())+",";
				//responseText += Float.toString(dataObj.getnFirstSeason())+",";
				//responseText += Float.toString(dataObj.getnSecondSeason())+",";
				//responseText += Float.toString(dataObj.getnThirdSeason())+",";
				//responseText += Float.toString(dataObj.getnForthSeason())+",";
				responseText += Float.toString(dataObj.getnJanuary())+",";
				responseText += Float.toString(dataObj.getnFebruary())+",";
				responseText += Float.toString(dataObj.getnMarch())+",";
				responseText += Float.toString(dataObj.getnApril())+",";
				responseText += Float.toString(dataObj.getnMay())+",";
				responseText += Float.toString(dataObj.getnJune())+",";
				responseText += Float.toString(dataObj.getnJuly())+",";
				responseText += Float.toString(dataObj.getnAugust())+",";
				responseText += Float.toString(dataObj.getnSeptember())+",";
				responseText += Float.toString(dataObj.getnOctober())+",";
				responseText += Float.toString(dataObj.getnNovember())+",";
				responseText += Float.toString(dataObj.getnDecember());
			}
			StringBuffer sb = new StringBuffer();
			sb.append(responseText);
			response.setContentType("text/plain; charset=UTF-8");
			response.setHeader("Cache-Control","no-cache");
			Writer writer = response.getWriter();
			writer.write(sb.toString());
			writer.flush();
			writer.close();
		}
        }
}

在理解了MVC后,就对Java web的运作流程也就有了大体的了解。但是这个模式对小项目还可以,在面对企业级的应用时,就得需要使用到ssh框架,不然程序的健壮性完全不行。这些都是后话了,MVC 的介绍暂时说道这里。这些都是个人的学习理解,如有不对的地方欢迎评论指正!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值