由于接了一个小项目,于是边做边学了一段时间的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 > </span>private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
<span > </span>public crmServlet() {
<span > </span>super();
<span > </span>// TODO Auto-generated constructor stub
<span > </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 > </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 > </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 > </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 的介绍暂时说道这里。这些都是个人的学习理解,如有不对的地方欢迎评论指正!