实验七 MVC模式
一、实验目的
1. MVC模式。
2. JSP实现MVC模式。
3. 调试MVC程序实例。
4. 掌握MVC边线横模式的原理,会用javabean+servlet+JSP实现MVC模式编写程序。
二、实验内容
1、教材7.5.1节 等差、等比级数和。
2、教材7.5.2节 点餐。
三、实验步骤
1.等差、等比级数和
① 实验代码
文件:Series_Bean.java
package one;
public class Series_Bean{
double firstItem;
double var;
int number;
double sum;
String name="等差/等比";
public void setFirstItem(double a){
firstItem=a;
}
public double getFirstItem(){
return firstItem;
}
public void setVar(double b){
var=b;
}
public double getVar(){
return var;
}
public void setNumber(int n){
number=n;
}
public double getNumber(){
return number;
}
public void setSum(double s){
sum=s;
}
public double getSum(){
return sum;
}
public void setName(String na){
name=na;
}
public String getName(){
return name;
}
}
文件:ch7_1.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<jsp:useBean id="seriesData" class ="one.Series_Bean" scope="request"/>
<style>
#tom{
font-family:宋体;font-size:28;color:blue
}
</style>
<HTML>
<body bgcolor=#FFBBFF>
<form action="computeSum" id = tom method="post" >
等差级数求和:
<br>输入首项:<input type=text id=tom name="firstItem" size=4>
输入公差(公比):<input type=text id=tom name="var" size=4>
求和项数:<input type=text id=tom name="number" size=4>
<input type=submit name = "submit" id = tom value="提交(求等差级数和)" />
<input type=submit name = "submit" id = tom value="提交(求等比级数和)">
</form>
<table border=1 id = tom>
<tr>
<th> 级数的首项</th>
<th> <jsp:getProperty name="seriesData" property="name"/></th>
<th> 所求项数</th>
<th> 求和结果</th>
</tr>
<tr>
<td><jsp:getProperty name="seriesData" property="firstItem"/></td>
<td><jsp:getProperty name="seriesData" property="var"/></td>
<td><jsp:getProperty name="seriesData" property="number"/></td>
<td><jsp:getProperty name="seriesData" property="sum"/></td>
</tr>
</table>
</body>
</HTML>
文件:ComputeSum_Servlet.java
package one;
import one.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ComputeSum_Servlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
Series_Bean seriesData = new Series_Bean();
request.setCharacterEncoding("utf-8");
request.setAttribute("seriesData",seriesData);//request bean。
String mess =request.getParameter("submit");
String firstItem = request.getParameter("firstItem");
String var = request.getParameter("var");
String number = request.getParameter("number");
if(firstItem.length()==0||var.length()==0||number.length() == 0){
response.sendRedirect("ch7_1.jsp");
return;
}
if(mess.contains("等差")) {
compute(firstItem,var,number,seriesData,0);
}
else if(mess.contains("等比")) {
compute(firstItem,var,number,seriesData,1);
}
RequestDispatcher dispatcher=
request.getRequestDispatcher("ch7_1.jsp");
dispatcher.forward(request,response);
}
void compute(String firstItem,String var,String number,
Series_Bean seriesData,int type){
double a=Double.parseDouble(firstItem);
double d=Double.parseDouble(var);
int n=Integer.parseInt(number);
seriesData.setFirstItem(a);
seriesData.setVar(d);
seriesData.setNumber(n);
double sum=0,item=a;
int i=1;
if(type == 0) {
seriesData.setName("等差级数的公差");
while(i<=n){
sum=sum+item;
i++;
item=item+d;
}
seriesData.setSum(sum);
}
else if(type == 1){
seriesData.setName("等比级数的公比");
while(i<=n){
sum=sum+item;
i++;
item=item*d;
}
seriesData.setSum(sum);
}
}
}
文件:web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app>
<servlet>
<servlet-name>computeSum</servlet-name>
<servlet-class>one.ComputeSum_Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>computeSum</servlet-name>
<url-pattern>/computeSum</url-pattern>
</servlet-mapping>
</web-app>
② 运行结果
2.点餐
① 实验代码
文件:Food.java
package two;
public class Food implements Comparable<Food>{
String foodName ;
double price;
public void setFoodName(String name){
foodName = name;
}
public String getFoodName(){
return foodName;
}
public void setPrice(double d){
price = d;
}
public double getPrice(){
return price;
}
public int compareTo(Food food){
return (int)(food.getPrice()*1000-price*1000);
}
}
文件:MeanBean.java
package two;
import java.util.ArrayList;
import java.util.Collections;
public class MenuBean {
String time ;
String totalPrice;
ArrayList<Food> foodList;
public MenuBean(){
foodList = new ArrayList<Food>();
}
public void addFood(Food food){
foodList.add(food);
Collections.sort(foodList);
}
public void removeFood(int index){
if(index>=0){
foodList.remove(index);
Collections.sort(foodList);
}
}
public String getFoodName(int index) {
return foodList.get(index).getFoodName();
}
public double getPrice(int index) {
return foodList.get(index).getPrice();
}
public int size() {
return foodList.size();
}
public void setTime(String time){
this.time = time;
}
public String getTime(){
return time;
}
public String getTotalPrice(){
double sum = 0;
for(Food food:foodList){
sum += food.getPrice();
}
totalPrice = String.format("%.2f",sum);
return totalPrice;
}
}
文件:ch7_2.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<jsp:useBean id="menu" class ="two.MenuBean" scope="session"/>
<style>
#textStyle{
font-family:宋体;font-size:36;color:blue
}
</style>
<HTML>
<body bgcolor=#ffccff>
<form action="addMenu" id= textStyle method=post>
输入餐单(每次输入一个消费项目):<br>
名称:<input type=text name='foodName' id =textStyle value ='剁椒鱼头' size = 8 />
价格:<input type=text name='price' id =textStyle value ='26.9' size = 8 />
<br><input type=submit id=textStyle value="添加到餐单">
</form>
</body>
</HTML>
文件:ch7_3.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<jsp:useBean id="menu" class ="two.MenuBean" scope="session"/>
<style>
#tom{
font-family:宋体;font-size:26;color:blue
}
</style>
<HTML>
<body bgcolor=pink>
<table border=1>
<tr>
<th id=tom>序号</th><th id=tom>食物名称</th><th id=tom>价格</th>
<%
request.setCharacterEncoding("utf-8");
String index = request.getParameter("删除");
if(index!=null){
menu.removeFood(Integer.parseInt(index));
}
for(int i=0;i<menu.size();i++){
out.print("<tr>");
out.print("<td id=tom>"+(i+1)+"</td>");
out.print("<td id=tom>"+menu.getFoodName(i)+"</td>");
out.print("<td id=tom>"+menu.getPrice(i)+"</td>");
out.print("<td ><form action ="+"ch7_3.jsp"+" method=post>");
out.print("<input type = hidden name = 删除 value = "+i+" />");
out.print("<input type = submit value = 删除该食物 />");
out.print("</form></td>");
out.print("</tr>");
}
%> </table>
<p id = tom>
餐单总额(共有<%=menu.size()%>道食物):
<jsp:getProperty name="menu" property="totalPrice" /><br>
点餐时间:
<jsp:getProperty name="menu" property="time" />
</p>
<a id =tom href="ch7_2.jsp">继续点餐</a>
</body>
</HTML>
文件:HandleMenu_Servlet.java
package two;
import two.Food;
import two.MenuBean;
import java.util.*;
import java.io.*;
import java.time.LocalTime;
import javax.servlet.*;
import javax.servlet.http.*;
public class HandleMenu_Servlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
request.setCharacterEncoding("utf-8");
MenuBean menu = null;
HttpSession session=request.getSession(true);
menu = (MenuBean)session.getAttribute("menu");
if(menu == null ){
menu = new MenuBean();
session.setAttribute("menu",menu);
}
String foodName = request.getParameter("foodName");
String price = request.getParameter("price");
Food food = new Food();
if(foodName.length()==0||price.length()==0){
response.sendRedirect("ch7_2.jsp");
return;
}
food.setFoodName(foodName);
food.setPrice(Double.parseDouble(price));
LocalTime dateTime = LocalTime.now();
String str = dateTime.toString();
String time =str.substring(0,str.lastIndexOf("."));
menu.setTime(time);
menu.addFood(food);
response.sendRedirect("ch7_3.jsp");
}
}
文件:web.xml
<servlet>
<servlet-name>addMenu</servlet-name>
<servlet-class>two.HandleMenu_Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addMenu</servlet-name>
<url-pattern>/addMenu</url-pattern>
</servlet-mapping>
② 运行结果
四、实验总结
本次实验应用了MVC模式三部分设计,使用了request bean和session bean存储数据,使用servlet处理数据,并将有关数据存储到request bean和session bean,再用jsp页面显示request bean和session bean数据。