MVC模式
模型(Model) Bean
用于存储数据的对象。Javabean对象
视图(View)
向控制器提交所须数据、显示模型中的数据。JSP页面
控制器(Controller) -servlet
servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到Javabean中,然后servlet使用转发或重定向的方式请求视图中的某个JSP页面显示数据,比如让某个JSP页面通过使用Javabean标记、Java程序片或Java表达式显示控制器存储在Javabean中的数据。
使用javax.servlet.http包中的类,javax.servlet.http包不在JDK的核心类库中,因此需要将Tomcat安装目录lib子目录中的servlet-api.jar文件复制到Tomcat服务器所使用的JDK的扩展目录中,比如,复制到D:\jdk1.7\jre\lib\ext中
模型的生命周期与视图更新
useBean标记:
<jsp:useBean id="名字" class="创建bean的类" scope="生命周期"/>
创建Javabean。
也可以由控制器servet创建Javabean
生命周期分为request、session和application。
1.request周期的Javabean
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到request中,并指定查找该bean的关键字: request.setAttribute("keyWord",bean);
视图更新
. jsp页面可以使用bean.
<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope="request"/>
或
<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="request"/>
2. session周期的Javabean
1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到session中,并指定查找该bean的关键字: session.setAttribute("keyWord",bean);
视图更新
servlet使用转发或重定向方法让JSP页面来显示bean中的数据
jsp页面可以使用
<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope=“sessiont"/>
或
<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope=“session"/>
3. application周期的Javabean
Javabean的创建
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到appication中,并指定查找该bean的关键字:
getServletContext().setAttribute("keyWord",bean);
视图更新
servlet使用转发或重定向
jsp页面可以使用
<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope=“appication"/>
或
<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope=“application"/>
Javabean模型中的getXxx和setXxx方法不涉及对数据的具体处理细节,以便增强模型的通用性。
实验
6_1 计算一元二次方程的根
1.相关知识点
servlet(BeanClass)负责创建生命周期为request的be3edddddan关键代码是:
BeanClass bean=new BeanClass();
request.setAttribute("keyWord",bean);
上述代码会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id是"keyWord",scope(生命周期)是PageContext.REQUEST_SCOPE(request)。
servlet负责根据模型中数据的变化通知视图(JSP页面)更新。对于scope是request的bean,其手段是使用转发,即使用RequestDispatcher对象向某个JSP页面发出请求,让所请求的JSP页面显示bean中的数据。
2.实验目的
本实验的目的是让学生掌握在MVC模式中怎样使用scope是request的bean。
3.实验要求
- 视图
提供两个JSP页面,一个页面使得用户可以输入一元二次方程的系数;另一个页面可以显示一元二次方程的系数和根。
- 数据模型
提供的Javabean负责刻画一元二次方程,即可以存储一元二次方程的系数以及方程的根,提供简单的获取数据和修改数据的方法。
- 控制器
负责计算一元二次方程的根,然后将有关数据存储到Javabean数据模型中,然后用转发的方式请求视图中负责显示数据的JSP页面显示Javabean数据模型中的数据。
Debug:
设置request参数,转发
奇怪,明明引用bean的都注释了(修改的文件错了,应该是移出文件夹后的)
bean equation not found within scope
for servlet [EquationServlet] in context with path [/test1] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
set、getAttribute对应使用
<!-- web.xml -->
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>EquationServlet</servlet-name>
<servlet-class>myservlet.control.EquationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EquationServlet</servlet-name>
<url-pattern>/EquationServlet</url-pattern>
</servlet-mapping>
<!-- input.jsp -->
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
This is my JSP page. <br>
<form action="EquationServlet" method="get">
y=<input type="text" size="2" name="a">x^2+
<input type="text" size="2" name="b">x+
<input type="text" size="2" name="c">
<input type="submit" value="提交">
</form>
</body>
</html>
//EquationServlet.java
package myservlet.control;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Bean.Equation;
public class EquationServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public EquationServlet() {
super();
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
double a=Double.parseDouble(request.getParameter("a"));
double b=Double.parseDouble(request.getParameter("b"));
double c=Double.parseDouble(request.getParameter("c"));
double root1,root2;
double delta=b*b-4*a*c;
Equation equation=new Equation();
equation.setA(a);
equation.setB(b);
equation.setC(c);
System.out.println("------------>delta:"+delta);
if(delta>=0){
root1=(-b+Math.sqrt(delta))/(2*a);
root2=(-b-Math.sqrt(delta))/(2*a);
equation.setRoot1(root1);
equation.setRoot2(root2);
System.out.println("------------>根"+root1);
request.setAttribute("status","1");
}else{
System.out.println("------------>无实数解");
request.setAttribute("status","0");
}
request.setAttribute("equation",equation);
RequestDispatcher dispatcher=request.getRequestDispatcher("output.jsp");
dispatcher.forward (request,response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
<!-- output.jsp -->
<%@page import="Bean.Equation"%>
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<jsp:useBean id="equation" type="Bean.Equation" scope="request"/>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
This is my JSP page. <br>
<%
String status=(String)request.getAttribute("status");
out.print(status);
if(status.equals("1")){
double a=equation.getA();
double b=equation.getB();
double c=equation.getC();
double root1=equation.getRoot1();
double root2=equation.getRoot2();
out.println("y="+a+"x^2+"+b+"x+"+c);
out.println("解为:"+root1+" "+root2);
}else{
out.print("无解");
}
%>
</body>
</html>