J2EE-18 MVC和struts框架
将猜数游戏改成符合MVC设计模式的程序
模型
NumberGuessBean
控制器
预处理请求数据
调用模型对象
根据模型的状态选择视图
在视图里面只访问模型的读函数,访问模型的数据
将jsp拆分成三个JSP
创建模型
实现
NumberGuessBean
用来给控制器调用
创建控制器
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import num.NumberGuessBean;
public class NumberGuessServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServetResponse response)throws ServletException,IOException{
NumberGuessBean bean = null;
HttpSession session = request.getSession();
Object o = session.getAttribute("bean");
//bean对象是存在session中的,因为猜数是有状态的连接
if(o == null){
bean = new NumberGuessBean();
session.setAttribute("bean",bean);
}else{
bean = (NumberGuessBean) o;
}
String guess = request.getParameter("guess");
//根据模型的状态选择不同的视图来渲染数据
if( !(guess==null || guess.length===0 )){
bean.setGuess(guess);
}
if(bean.getSuccess()){
request.getRequestDispatcher("/success.jsp").forward(request,response);
}
else if(bean.getNumGuesses() == 0){
request.getRequestDispatcher("/welcome.jsp").forward(request,response);
}
else{
request.getRequestDispatcher("/guess.jsp").forward(request,response);
}
}
}
拆分JSP
以success为例
<h1>Congratulaton! You have made 5 times</h1>
<h2>Do you want to play again?<h2>
5作为动态数据有三中填写方式
1.
<jsp:useBean id="bean" class="num.NumberGuessBean" scope="session">
<%=bean.getNumGuesses() %>
2.jsp动作
<jsp:getProperty name="bean" property="numGuesses"/>
3.
<jsp:useBean id="bean" class="num.NumberGuessBean" scope="session">
${bean.numGuesses}
JSP语法复习:
<%@ %>
<%= %>
<%! %>
<%-- --%>
<% %>
jsp动作:
<jsp:useBean />
<jsp:getProperty />
<jsp:setProperty />
<jsp:forward />
<jsp:include />
struts框架
两个控制器
前端控制器
后端控制器复用
前端控制器不调用模型
所以可以复用
struts 1
1.3的版本
ActionServlet
所有的后端控制器都要继承Action
控制类继承Action 覆盖 execute函数
前端控制器调用后端控制器的execute函数
execute函数
execute(ActionMapping mapping, ActionForm form, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
From里面是模型所需的数据
这里的设计存在缺陷 req 和 res 不需要
原因:客户的数据都在ActionForm中,不需要req再进行获取
ActionForm
封装输入数据和返回值
类里定义reset() 复原数据
validate() 验证 对输入域中的数据的合法性进行验证
部署servlet组件
java的包的命名是又大到小,与域名相反
作业:
1.看Struts 1 里的
ActionForward类