Java Web MVC模式个人学习理解

来源:互联网 发布:ie11调试器看不到js 编辑:程序博客网 时间:2024/06/05 15:08

由于接了一个小项目,于是边做边学了一段时间的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}@Overridepublic Connection getConnetion() throws DAOException {// TODO Auto-generated method stubDataSource 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 stubprocess(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 stubprocess(request, response);}protected void process(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {String szUri = request.getRequestURI();<span style="white-space:pre"></span>//获取uriint 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
原创粉丝点击