JSP程序设计实验报告

                                      **《JSP实用教程》实  验  报  告**

学 院:
专 业:
班 级:
姓 名:
学 号:
完成日期:



实验一 JSP语法

1.实验目的:

掌握include动作标记
掌握param动作标记

2.实验内容:

编写三个JSP页面:main.jsp、circle.jsp和ladder.jsp,将三个JSP页面保存在同一Web服务目录中。main.jsp使用include动作标记加载circle.jsp和ladder.jsp页面。circle.jsp页面可以计算并显示圆的面积,ladder.jsp页面可以计算并显示梯形的面积。当circle.jsp和ladder.jsp被 加载时获取 main.jsp页面include动作标记的param 子标记提供的圆的半径以及梯形的上底、下底和高的值 。

3.实验过程:

实验一:运行结果如图:

在这里插入图片描述

3.1.编写main.jsp 文件放到服务器目录下。

<%@ page contentType="text/html" %>
<%@ page pageEncoding="UTF-8" %>
<html><body bgcolor="aquamarine">
<% double a=6.00,b=7.00,h=9.00,r=2.0;
%> 
<p sytle = "font-family:黑体;font-size:72">
<br>加载ladder.jsp计算上底下底高分别为<%=a%>,<%=b%>,<%=h%>,<%=r%>的梯形面积.
	<jsp:include page="ladder.jsp">
		<jsp:param name="sideA" value="<%=a%>"/>
		<jsp:param name="sideB" value="<%=b%>"/>
		<jsp:param name="sideH" value="<%=h%>"/>
    </jsp:include>
<br>加载circle.jsp计算半径为<%=r%>的圆的面积.
	<jsp:include page="circle.jsp">
		<jsp:param name="sideR" value="<%=r%>"/>
	</jsp:include>
</p></body></html>

3.2.编写ladder.jsp文件放到服务器目录下。

<%@ page contentType="text/html" %>
<%@ page pageEncoding="UTF-8" %>
<%! public String getArea(double a,double b,double h){
    
    
	if(a>0&&b>0&&h>0){
    
    
		double s=(a+b)*h*0.5;
		String result=String.format("%.2f",s);//保留两位小数
		return result;	
		}
		else{
    
    
			return(""+a+","+b+","+h+"不能构成梯形,无法计算面积");
		}
} 
%>
<% String sideA=request.getParameter("sideA");
   String sideB=request.getParameter("sideB");
   String sideH=request.getParameter("sideH");
   double a = Double.parseDouble(sideA); 
   double b = Double.parseDouble(sideB); 
   double h = Double.parseDouble(sideH); 
%>
<p style="font-family:黑体;font-size:30;color: red;">
	<br><b>我是被加载的文件,计算梯形的面积<br>
	给我传传递的边长是:<%=sideA%>,<%=sideB%>,<%=sideH%></b>
	<br><b><i>梯形的面积(保留2位小数):<%=getArea(a,b,h)%></i></b>
</p>

3.3.编写circle.jsp文件放到服务器目录下。

<%@ page contentType="text/html" %>
<%@ page pageEncoding="UTF-8" %>
<%! public String getArea(double r){
    
    
	if(r>0){
    
    
		double s=Math.pi*r*r;
		String result=String.format("%.2f",s);//保留两位小数
		return result;	
		}
		else{
    
    
			return(""+r+"不能构成圆,无法计算面积");
		}
} 
%>
<% String sideR=request.getParameter("sideR");
   double r = Double.parseDouble(sideR);
%>
<p style="font-family:黑体;font-size:25;color: red;">
	<br><b>我是被加载的文件,计算圆的面积<br>
	给我传传递的半径是:<%=sideR%></b>
	<br><b><i>圆的面积(保留2位小数):<%=getArea(r)%></i></b></p>

4.实验总结:

本节实验通过学习jsp基础语法和jsp语法相关的实验我对jsp有啦一定的了解并且热爱jsp ,经过实验一我学到啦关于jsp的许多内容
1、了解jsp页面的基本结构
普通的HTML标记和javascript 标记、jsp标记,(指令标记,动作标记等)、
2、声明变量和定义方法 <%! 变量或方法 %>
3、Java 程序片的理解与编写 <% 程序片 %>
4、Java 表达式理解与编写 <%=可以求值的表达式%>
5、JSP 指令标记的使用 <% page 属性1=”属性1的值”%>
<%@ include file=”文件路径url”%>
6、JSP动作标记的使用<jsp:include page=”文件路径url”/>或
<jsp:include page=”文件路径url”>
Param 子标记
</jsp:include>
<jsp:param name=”参数” value=”参数值”/>
<jsp:forward page=”要转向的页面”/>或
<jsp:forward page=”要转向的页面”/>
param 子标记 </jsp:forward>

实验二 Tag文件与Tag标记

1.实验目的:

掌握tag标记与tag文件的应用
掌握tag文件中的常用指令

2.实验内容:

2.1、编写两个tag文件Rect.tag和Circle.tag。Rect.tag负责计算并显示矩形的面积,Circle.tag负责计算并显示 圆的面积。编写一个JSP页面lianxi6.jsp,该JSP页面使用tag标记调用Rect.tag和Circle.tag。调用Rect.tag时,向其传递矩形的两个边的长度;调用Circle.tag时,向其传递圆的半径。
运行结果:

3.实验过程:

lianxi6.jsp 运行结果如图:
在这里插入图片描述
3.1.1编写Lianxi6.jsp:

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<%@ taglib tagdir="/WEB-INF/tags/tagp59" prefix="getR"%>
<%@ taglib tagdir="/WEB-INF/tags/tagp59" prefix="getC"%>
	<html><body bgcolor="aquamarine">
    <p style="font-family: 宋体;font-size:18px;" >
		<getR:Rect sideA="2" sideB="4"/>
		<getC:Circle sideR="2"/>
	</p>
	</body></html>


	

3.1.2.编写Rect.tag

<%@ tag pageEncoding="utf-8"%>
<%@ attribute name="sideA" required="ture"%>
<%@ attribute name="sideB" required="ture"%>
<%! public String getRect(double a,double b){
    
    
	if(a>0&&b>0){
    
    
		double s=a*b;
		String S=String.format("%.2f",s);
		return"<br>矩形面积s="+S;
	}
	else
       return("不能构成矩形");
}
%>
<% out.println("<br>长:"+sideA+"&nbsp;<br>宽:"+sideB);
      double a=Double.parseDouble(sideA);
	  double b=Double.parseDouble(sideB);
	  out.println(getRect(a,b));
 %>```



3.1.3.编写Circle.jsp

```java
<%@ tag pageEncoding="utf-8"%>
<%@ attribute name="sideR" required="ture"%>
<%! public String getCircle(double r){
    
    
	if(r>0){
    
    
		double p=Math.PI*r*r;
		String P=String.format("%.2f",p);
		return"<br>圆的面积:p="+P;
	}
	else
	   return("不能构成圆");
}
%>
<% out.println("<br><br>圆的半径:"+sideR);
double r=Double.parseDouble(sideR);
out.println(getCircle(r));
%>

2.2、编写一个tag文件:GetArea.tag负责求出三角形的面积,并使用variable指令返回三角形的面积给调用该tag文件的JSP 页面。JSP页面负责显示tag文件返回的三角形的面积。JSP在调用tag文件时,使用attribute指令将三角形三边的长度传递给tag文件。One.jsp和two.jsp都使用tag标记调用GetArea.tag。one.jsp返回的三角形的面积保留最多3位小数,two.jsp返回的三角形的面积保留最多6位小数。
one.jsp 运行结果图:
在这里插入图片描述

Two.jsp 运行结果:
在这里插入图片描述

3.2.1编写One.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<%@page import="java.text.*" %>
<%@ taglib tagdir="/WEB-INF/tags/tagp59" prefix="getS"%>
	<html><body bgcolor="bisque"><p style="font-family: 宋体;font-size:15;color: blueviolet;">
   	<form action="" method="post">
		<h3 align="center">请输入需要计算的三角形的边长:</h3>
		<table align="center">
			<tr>
				 <td align="left" colspan="0">请输入第一条边&nbsp;&nbsp;a:</td>
				 <td><input type="text" name="a"/></td>
		    </tr>
			<tr>
				 <td align="left" colspan="0">请输入第二条边&nbsp;&nbsp;b:</td>
				 <td><input type="text" name="b"/></td>
		    </tr>
			<tr>
				 <td align="left" colspan="0">请输入第三条边&nbsp;&nbsp;c:</td>
				 <td><input type="text" name="c"/></td>
		    </tr>
		</table><br/>
		<table align="center"><td align="center">
                                       <input align="center" type="submit" name="submit" value="提交计算(计算结果最多保留3位小数)"/></td></table>
		<%  String a=request.getParameter("a");
			String b=request.getParameter("b");
			String c=request.getParameter("c");
			if(a==null||b==null||c==null){
    
    
				a="0";
				b="0";
				c="0";
			}
			if(a.length()>0&&b.length()>0&&c.length()>0){
    
    
		%>
				<getS:GetArea sideA="<%=a %>" sideB="<%=b %>" sideC="<%=c %>" />
				<b><p align="center" style="font-family: 宋体;font-size: 18px; color: crimson;" >
		<%
				NumberFormat f=NumberFormat.getInstance();
		        f.setMaximumFractionDigits(3);
		        double result=area.doubleValue();
		        String str=f.format(result);
		        out.println("三角形面积:&nbsp;&nbsp;S="+str);

			}
			 %>
                </p></b></<body> </html>

3.2.2编写Two.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<%@page import="java.text.*" %>
<%@ taglib tagdir="/WEB-INF/tags/tagp59" prefix="getS"%>
	<html><body bgcolor="bisque"><p style="font-family: 宋体;font-size:15;color: blueviolet;">
   	<form action="" method="post">
		<h3 align="center">请输入需要计算的三角形的边长:</h3>
		<table align="center">
			<tr>
				 <td align="left" colspan="0">请输入第一条边&nbsp;&nbsp;a:</td>
				 <td><input type="text" name="a"/></td>
		    </tr>
			<tr>
				 <td align="left" colspan="0">请输入第二条边&nbsp;&nbsp;b:</td>
				 <td><input type="text" name="b"/></td>
		    </tr>
			<tr>
				 <td align="left" colspan="0">请输入第三条边&nbsp;&nbsp;c:</td>
				 <td><input type="text" name="c"/></td>
		    </tr>
		</table><br/>
		<table align="center"><td align="center">
                                      <input align="center" type="submit" name="submit" value="提交计算(计算结果最多保留6位小数)"/></td></table>
		<%  String a=request.getParameter("a");
			String b=request.getParameter("b");
			String c=request.getParameter("c");
			if(a==null||b==null||c==null){
    
    
				a="0";
				b="0";
				c="0";
			}
			if(a.length()>0&&b.length()>0&&c.length()>0){
    
    
		%>
				<getS:GetArea sideA="<%=a %>" sideB="<%=b %>" sideC="<%=c %>" />
				<b><p align="center" style="font-family: 宋体;font-size: 18px; color: crimson;" >
		<%
				NumberFormat f=NumberFormat.getInstance();
		        f.setMaximumFractionDigits(6);
		        double result=area.doubleValue();
		        String str=f.format(result);
		        out.println("三角形面积:&nbsp;&nbsp;S="+str);

			}
			 %>
                </p></b>
	</<body> </html>

3.2.3编写GetArea.tag

<%@ tag pageEncoding="utf-8"%>
<%@ attribute name="sideA" required="true"%>
<%@ attribute name="sideB" required="true"%>
<%@ attribute name="sideC" required="true"%>
<%@ variable name-given="area" variable-class="java.lang.Double" scope="AT_END"%>
<p align="center"style="font-family: 宋体;font-size: 18px;  color: black;">
<% out.println("你所输入的值分别为:<br>a="+sideA+"&nbsp;&nbsp;&nbsp;b="+sideB+"&nbsp;&nbsp;c="+sideC);
	double a=Double.parseDouble(sideA);
	double b=Double.parseDouble(sideB);
	double c=Double.parseDouble(sideC);
	if(a+b>c&&a+c>b&&c+b>a){
    
    
		double p=(a+b+c)/2.0;
		double area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
		jspContext.setAttribute("area",new Double(area));
	}
	else{
    
    
		jspContext.setAttribute("area",new Double("-1"));
	}
%>
</p>

2.3、编写一个tag文件:count.tag负责计算一元二次方程的解的值,并使用variable和attribute指令传递参数和返回参数。编写一个jsp页面展示tag的计算结果。
程序运行结果图:
count.jsp 运行结果如图:
在这里插入图片描述
3.3.1编写count.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding="UTF-8" %>
	<%@ taglib tagdir="/WEB-INF/tags" prefix="getx"%>
		<html><body bgcolor="aquamarine">
		<p style="font-family: 宋体;font-size: 28;color: brown">
			<getx:count a1="1" b1="3" c1="2"/>
		</p>
		</body> </html>

3.3.2编写count.tag

<%@ tag pageEncoding="utf-8"%>
<%@ attribute name="a1" required="ture"%>
<%@ attribute name="b1" required="ture"%>
<%@ attribute name="c1" required="ture"%>
<%! public String getX(double A,double B,double C){
    
    
	if(A!=0){
    
    
		if((B*B-4*A*C)>=0){
    
    		
			double x1=(-B+Math.sqrt(B*B-4*A*C))/(2*A);
		    double x2=(-B-Math.sqrt(B*B-4*A*C))/(2*A);
		    String X1 =String.format("%.2f",x1);
		    String X2 =String.format("%.2f",x2);
		    return("<br>方程的解如下:<br>X1="+X1+"&nbsp;X2="+X2+"");
			}
			else
			 return("<br>此方程无实数根");

	}
	else{
    
    	
		double x=-C/B;
	    String X =String.format("%.2f",x);
	    return("<br>x^2的系数为o此方程不是一元二次方程<br>x="+X);
}

}
%>
<% out.println("<br>"+a1+"X^2+"+b1+"X+"+c1);
   double A=Double.parseDouble(a1);
   double B=Double.parseDouble(b1);
   double C=Double.parseDouble(c1);
   out.println(getX(A,B,C));
   %>

4.实验总结:

本节实验通过学习jsp的tag 文件对得编写与tag 标记的使用并进行实验运用,
对jsp有了更深一步的了解和学习
1、了解Tag 文件的结构
2、Tag标记的使用
3、Tag 文件中的常用指令 调用tag文件
<%@ taglib=”标记库的位置” prefix=”前缀(自己随意取)”>
使用:<前缀:tag文件名/>
4、attribute指令 ,variable指令
attribute 指令让使用他的jsp页面向该tag文件传递需要的数据
<%@ attribute name=”对象名字”request=”true|false”type=”对象类型”%>
通过variable 指令可以将tag 文件中的对象返回给调用该tag文件的jsp 页面
<%@ variable name-given=”对象名”variable-class=”对象类型”scope=”有效范围”%>

实验三 JSP内置对象

1.实验目的:

掌握内置对象的常用方法

2.实验内容:

1、编写一个JSP页面select Music.jsp,该页面使用select(下拉列表)提供一些歌曲名,用户选择一个歌曲名,单击提交键提交给当前页面,然后当前页面播放用户选择的音乐(音频文件保存在Web服务目录的\music子目录中)。

3.实验过程:

select Music.jsp 运行结果如图:
在这里插入图片描述

文件结构:
在这里插入图片描述

3.1.1编写selectMusic.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding="UTF-8" %>
	<style>
	#tom{
    
    font-family: 宋体;font-size: 18px;color: brown;}
	#t{
    
    font-family: 黑体;font-size: 20px; color: black;}
	.box1{
    
    
		position: absolute;
		top: 50px;
		height: 600px;
		width: 1000px;
		align-content: center;
		background-color: aqua;
		text-align: center;
		right: 100px;
		left: 300px;
	}
	</style>
<html><body bgcolor="cadetblue">
<div class="box1">
<form  action="" method="post">
	<h2 id="t">选择要播放的music:</h2>
		<select id="tom" name="music">
			<option selected value="music1.mp3">雪下的时候</option>
			<option value="music2.mp3">music2</option>
			<option value="music3.mp3">music3</option>
			<option value="music4.mp3">music4</option>
			<option value="music5.mp3">music5</option>
			<option value="music6.mp3">music6</option>
			<option value="music7.mp3">music7</option>
			<option value="music8.mp3">music8</option>
			<option value="music9.mp3">music9</option>
			<option value="music10.mp3">music10</option>
		</select>
		<input type="radio" name="R" value="on"/>打开
		<input type="radio" name="R" value="off"/>关闭
		<br/><br/>

		<input type="submit" value="提交" id="tom"/>
</form>
 <% String music=request.getParameter("music");
   String onOrOff=request.getParameter("R");
   if(music==null) music="";
   if(onOrOff==null) onOrOff="on";
%>
<% if(onOrOff.equals("on")){
    
    
	%>
	<br><embed src="music/<%=music %>" height="80"/>

<%}
%>	
</div>
</body></html>

2、【选做题】编辑2个页面,实现如下功能。第一个用户注册页面为index.jsp,第二个显示页面为login.jsp。
在这里插入图片描述
在这里插入图片描述

Index.jsp 运行结果如图:
在这里插入图片描述
提交给login.jsp 运行结果如图:
在这里插入图片描述

3.2.1编写index.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
	<style>
	#tom{
    
    font-family: 宋体;font-size: 28px;}
	</style>
<html><body bgcolor="beige">
<div id="tom">
	<h3>用户注册</h3><br/>
	<form action="login.jsp" method="post">
		姓名:<input id="tom" type="text" name="username" value="丽丽"/><br/>
		密码:<input id="tom" type="password" name="password" value="123456"/><br/>
		性别:<input type="radio" name="sex" value="男"/>&nbsp;&nbsp;
		     <input type="radio" name="sex" value="女"/><br/> 
		兴趣:<input type="checkbox" name="hobby" value="前端"/>前端&nbsp;
		     <input type="checkbox" name="hobby" value="后端"/>后端&nbsp;
			 <input type="checkbox" name="hobby" value="美工"/>美工<br/>
		<input type="submit" name="submit" value="提交"/>&nbsp;
		<input type="reset" name="reset" value="重置" />
	</form>
</div>
</body> </html>	

3.2.2 编写login.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
<style>
</style>
<html><body bgcolor="beige">
<% request.setCharacterEncoding("utf-8");
  String user=request.getParameter("username");
  String password=request.getParameter("password");
  String sex=request.getParameter("sex");
  String hobby[]=request.getParameterValues("hobby");
  out.print("<h2>欢迎您!</h2>");
  out.print("姓名:"+user+"<br>");
  out.print("密码:"+password+"<br>");
  if (sex==null){
    
    
	  out.print("性别:性别都不选,你是人妖吗?<br/>");
  }
  else{
    
    
	    out.print("性别:"+sex+"<br/>");
  }
  out.print("兴趣:");
  if (hobby==null){
    
    
	  out.print("你没有选择兴趣爱好");
  }
  else{
    
    
	  for(int k=0;k<hobby.length;k++){
    
    
       out.print(" "+hobby[k]);		  
	  }
  }
%>
</body> </html>

4.实验总结:

本章实验内容主要为学习为jsp 内置对象的理解与使用,学习内容有
1、request 对象。(获取用户表单提交的信息,内置对象request对象调用getParameter(String s)方法 s取值是input 标签中 name 给出的名字
例如
Request.getParameter(“s”)
request 对象处理汉字信息:让rquest 对象在获取信息之前调用setCharacterEncoding将编码设置为utf-8 可以避免乱码现象
request.setCharacterEncoding(“utf-8”);
2、response对象(可以用response 对象对用户的请求做出动态响应,向用户端发送数据。response 对象的setContentType(String s) 方法来改变contenType 的属性值,
response 可以将用户重新引导至另一个页面。可以 使用response 对象的sendRedirect(URL url) 方法实现用户重定向,让用户重一个页面跳转到其中的url 指定的页面,
2、session 对象(session 是实现HttpSession 接口的一个实例,
同一个用户在不同的web 服务目录中的session 对象是互不相同的
如果用户不支持Cookie,jsp页面可以通过url重写来实现session 对象的唯一性

实验四 JSP与JavaBean

1.实验目的:

编写和使用JavaBean
获取和修改bean的属性
JSP与bean结合

2.实验内容:

1、编写一个JSP页面,该页面提供一个表单,用户可以通过表单输入梯形的上底、下底和高的值 ,并提交给本JSP页面,该JSP页面将计算梯形面积的任务交给一个page bean 去完成。JSP页面使用getProperty动作标记显示page bean中的数据,例如梯形的面积。

3.实验过程:

ladder.jsp 运行结果如图:
在这里插入图片描述

3.1.1编写ladder.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
	<html><body bgcolor="aquamarine" >
	<style>
	#tom{
    
    font-family: 宋体;font-size: 18px;color: black;}
	</style>
<jsp:useBean id="ladder" class="area.star.LadderBean" scope="page"></jsp:useBean>
<div align="center">
<form action="" method="post">
	<h3>请输入梯形的各边</h3>
		<span id="tom">上底:</span><input id="tom" type="number" name="sideA" placeholder="请输入上底"/><br/><br>
		<span id="tom">下底:</span><input id="tom" type="number" name="sideB" placeholder="请输入下底"/><br><br>
		<span id="tom">&nbsp;:</span><input id="tom" type="number" name="sideH" placeholder="请输入高"/>
		<br/><input type="submit" name="sunmit" value="提交处理"/>
	</form>
	<jsp:setProperty name="ladder" property="*"></jsp:setProperty>
	<span id="tom">梯形的各边:</span><br>
	<span id="tom">上底:</span><jsp:getProperty name="ladder" property="sideA"></jsp:getProperty>&nbsp;&nbsp;
	<span id="tom">下底:</span><jsp:getProperty name="ladder" property="sideB"></jsp:getProperty>&nbsp;&nbsp;
	<span id="tom">高 h:</span><jsp:getProperty name="ladder" property="sideH"></jsp:getProperty><br>
	<br><b>梯形的面积是:</b><jsp:getProperty name="ladder" property="area"></jsp:getProperty>
	</body></html>
	</div>

3.1.2编写LadderBean.java

package area.star;
public class LadderBean {
    
    
	double sideA=-1,sideB=-1,sideH=-1;
	String area;
	//boolean isLadder;
	public double getSideA(){
    
    
		return sideA;
	}
	public void setSideA(double a){
    
    
		sideA=a;
	}
	public double getSideB(){
    
    
		return sideB;
	}
	public void setSideB(double b){
    
    
		sideB=b;
	}
	public double getSideH(){
    
    
		return sideH;
	}
	public void setSideH(double h){
    
    
		sideH=h;
	}
	public String getArea(){
    
    
		//if(isLadder){
    
    
			double S=((sideA+sideB)*sideH)/2.0;
			area=String.format("%.2f",S);
		//}
		return area;
	}
	//public boolean getIsLadder(){
    
    
		//if(sideA>0&&sideB>0&&sideH>0&&sideA!=sideB){
    
    
			//isLaddder=ture;
		//}
		//else
		//isLadder=false;
		//return isLadder;
	//}
}

将LadderBean.java编译成LadderBean.class

2、编写两个JSP页面a.jsp和b.jsp,a.jsp页面提供一个表单,用户可以通过表单输入矩形的两个边长提交给b.jsp页面,b.jsp调用一个request bean 去完成计算矩形面积的任务。b.jsp页面使用getProperty动作标记显示矩形的面积。
a.jsp 运行结果图:
在这里插入图片描述

a.jsp 提交给b.jsp 运行结果如图:
在这里插入图片描述

3.2.1编写a.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
	<style>
	.box1{
    
    position: absolute;
	     background-color: aquamarine;
		 height: 400px;
		 width: 800px;
		 top: 10px;
		 text-align: center;
		 font-size: 18px;
		 float: right;
		 left: 50px;
	}
	</style>
	<html><body>
	<div class="box1">
		<h2>计算矩形的面积与周长</h2>
		<form action="b.jsp" method="post">
			矩形的长:<input type="text" name="sideA" value="2"/><br/>
			矩形的宽:<input type="text" name="sideB" value="4" /><br/>
			<input type="submit" name="submit" value="提交"/>
		</form>
	</div>
	</body> </html>

3.2.2编写b.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8" %>
	<style> 
	.box1{
    
    
		position: absolute;
		top: 10px;
		height: 400px;
		width: 600px;
		float: none;
		left: 40px;
		background-color: aquamarine;
		font-size: 28px;
		color: crimson;
	}
	</style>
	<jsp:useBean  id="rectangle" class="area.star.rectangleBean" scope="request"></jsp:useBean>
	<html><body>
	<jsp:setProperty name="rectangle" property="sideA" param="sideA"></jsp:setProperty>
	<jsp:setProperty name="rectangle" property="sideB" param="sideB"></jsp:setProperty>
	<br/>
	<div class="box1">
		<h3>计算结果:</h3>
	矩形的长:&nbsp;a=<jsp:getProperty name="rectangle" property="sideA"></jsp:getProperty><br/>
	矩形的宽:&nbsp;b=<jsp:getProperty name="rectangle" property="sideB"></jsp:getProperty><br/>
	矩形的面积:&nbsp;S=<jsp:getProperty name="rectangle" property="area"></jsp:getProperty><br/>
	矩形周长:&nbsp;P=<jsp:getProperty name="rectangle" property="perimeter"></jsp:getProperty>
	</div>
		</body></html>

3.2.3编写rectangleBean.java

package area.star;
public class rectangleBean{
    
    
	double sideA,sideB;
	String area,perimeter;
	public double getSideA(){
    
    
		return sideA;
	}
	public void setSideA(double A){
    
    
		sideA=A;
	}
	public double getSideB(){
    
    
		return sideB;
	}
	public void setSideB(double B){
    
    
		sideB=B;
	}
	public String getArea(){
    
    
		double S=sideA*sideB;
		area=String.format("%.2f",S);
                                       return area;

	}
	public String getPerimeter(){
    
    
		double P=(sideA+sideB)*2;
		perimeter=String.format("%.2f",P);
		return perimeter;
                   }
                       
	} 

将rectangleBean.java编译成rectangleBean.java.class

4.实验总结:

本次实验学习jsp页面与javaBean 的逻辑处理 、
1、编写与使用javaBean
使用:getXxxx(),用来获取xxxx. setXxxx(),用来获取xxxx.
方法的名字用get 或set 为前缀,后缀是将属性(成员变量)名字的首字母大写的字符序列。类中定义方法的访问权限都是public、类中必须有一个构造方法是public、无参数的。
2、获取与修改bean 的属性
使用useBean动作标记获得一个bean后,在Java程序片或表达式中bean就可以调用方法产生行为,这种情况下,不要求创建bean的类遵守setXxx和使用JSP动作标记
getXxx等规则。获取或修改bean的属性还可以使用JSP 动作标记getProperty、setProperty,这种情况下,要求创建bean的类遵守setXxx和getXxx等规则,当标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法,即对方法名字的命名有特殊的要求。
getProperty 动作标记
使用getProperty 动作标记前,必须使用useBean 动作标记获取相应的bean。
<jsp:getProperty name=”bean的id” property=”bean的属性”/>
setProperty 动作标记 使用setProperty 动作标记可以设置bean 的属性值。使用前必须使用useBean获取相应的bean.
将bean属性值设置为一个表达式的值或字符系列。
<jsp:setProperty name=”bean的id” property=”bean的属性” value=”<%=expression%>”/>或
<jsp:setProperty name=”bean的id” property=”bean的属性” value=”字符系列”/>
通过HTTP表单的参数值来设置相应的属性值。
用表单的所有参数值设置bean相应属性值
<jsp:setProperty name=”bean的id的名字” property=”*”/>
用from表单的某个参数的值设置bean 的某个属性值
<jsp:setProperty name=”bean名字” property=”属性名” param=”参数名”/>

实验五 Java Servlet基础

1.实验目的:

编写Servlet类
部署web.xml文件

2.实验内容:

1、JSP页面exampel6_3.jsp通过form表单请求名字是computeBill的servlet,向所请求的computeBill提交一个账单明细,并动态输入折扣的明细discount的值。

3.实验过程:

exampel6_3.jsp运行结果如图:

在这里插入图片描述

提交 结果如图:
在这里插入图片描述

3.1.1编写eaxmple6_3.jsp:

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
<html><body>
<form action="computeBill" method="post">
	<br>输入账单:<br>
	<textarea name="billMess" rows="5" cols="30">
		剁椒鱼头:62.9元,烤鸭:199元,黄焖大鸡:289.9元。
	</textarea>
	<br>输入折扣:<input type="text" name="discount"/><br>
	<input type="submit" value="提交"/>
	
</form>
</body>
</html>	

3.1.1编写Example6_3_Servelet:

package moon.sun;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Example6_3_Servlet extends HttpServlet{
    
    
       public void init(ServletConfig config)throws ServletException{
    
    
              super.init(config);
       }
       public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
    
    
              request.setCharacterEncoding("utf-8");
              response.setContentType("text/html;charset = utf-8");
              PrintWriter out = response.getWriter();
              out.println("<html><body bgcolor = yellow>");
              String discountMess = request.getParameter("discount");
              double discount = Double.parseDouble(discountMess);
              String billMess = request.getParameter("billMess");
              if(billMess == null){
    
    
                    out.print("没有账单");
                    return;
               }
              double bill = getPriceSum(billMess);
              double billDiscount = bill*(discount/10);
              out.print("<h2>"+billMess+"<br>消费:"+bill+"元");
              out.print("优惠"+discount+"折<br>后的金额:"+billDiscount+"元");
              out.print("</h2></body></html>");
         }
         public double getPriceSum(String input){
    
    
              Pattern   pattern;
              Matcher matcher;
              String regex = "-?[0-9][0-9]*[.]?[0-9]*";
              pattern = Pattern.compile(regex);
              matcher = pattern.matcher(input);
              double sum = 0;
              while(matcher.find()){
    
    
                    String str = matcher.group();
                    sum += Double.parseDouble(str);
               }
               return sum;
           }
}

3.1.3部署web.xml

<servlet>
       <servlet-name>computeBill</servlet-name>
       <servlet-class>moon.sun.Example6_3_Servlet</servlet-class>
</servlet> 
<servlet-mapping>
        <servlet-name>computeBill</servlet-name>
        <url-pattern>/computeBill</url-pattern>
</servlet-mapping>

文件结构:
在这里插入图片描述

2、JSP页面设置下拉列表或复选框,进行菜单的生成,给出折扣,计算总金额。

在这里插入图片描述
在这里插入图片描述

Example6_3_2.jsp 运行结果如下:

在这里插入图片描述
提交到servlet执行结果
在这里插入图片描述

3.2.1编写Example6_3_2.jsp:

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<style>
#tom{
    
    font-family: 宋体;font-size: 18px;color: brown;}
</style>
<html><body bgcolor="beige">
<div>
	<h1>结账信息</h1>
	<form action="computeBill?" method="post">
		桌号:<input type="number" name="desk" id="tom" value="15"/><br/>
		菜单:<br/>
		推荐菜品:
		<!--菜单一:<input type="text" name="billMess" id="tom" value="剁椒鱼头:62.9元"/><br>
		菜单二:<input type="text" name="billMess" id="tom" value="烤鸭:199元"/><br>
		菜单三:<input type="text" name="billMess" id="tom" value="黄焖鸡:289.9元"/><br>   -->
		剁椒鱼头:99:<input type="checkbox" name="billMess" id="tom" value="剁椒鱼头:99元"/>&nbsp;&nbsp;&nbsp;&nbsp;
		北京烤鸭:199:<input type="checkbox" name="billMess" id="tom" value="北京烤鸭:199元"/>&nbsp;&nbsp;&nbsp;&nbsp;
		糯米排骨:69:<input type="checkbox" name="billMess" id="tom" value="糯米排骨:69元"/>&nbsp;&nbsp;&nbsp;&nbsp;
		西芹百合:34:<input type="checkbox" name="billMess" id="tom" value="西芹百合:34元"/><br/>
		酒水饮料:&nbsp;&nbsp;
		大罐饮料:10<input type="checkbox" name="billMess" id="tom" value="大罐饮料:10元" />&nbsp;&nbsp;&nbsp;&nbsp;
		元气森林:20<input type="checkbox" name="billMess" id="tom" value="元气森林:20元" />&nbsp;&nbsp;&nbsp;&nbsp;
		江小白:30<input type="checkbox" name="billMess" id="tom" value="江小白:30元" />&nbsp;&nbsp;&nbsp;&nbsp;
		开卫:15<input type="checkbox" name="billMess" id="tom" value="开卫:15元" /><br/>
		<!--<select id="tom" name="billMess">
			<option selected value="剁椒鱼头:62.9元">剁椒鱼头:62.9</option>
			<option value="烤鸭:199元">烤鸭:199</option>
			<option value="黄焖鸡:289.9元">黄焖鸡:289.9</option>
		</select> -->
		<input type="text" name="discount" value="6" />
		<input type="submit" id="tom" value="提交"/>
	</form>
</div>
</body></html>

3.2.2编写Example6_3_2_Servlet.java

package moon.sun;
import java.io.*;
import javax.servlet.*;
import java.util.Arrays;
import javax.servlet.http.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Example6_3_2_Servlet extends HttpServlet{
    
    
       public void init(ServletConfig config)throws ServletException{
    
    
              super.init(config);
       }
       public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
    
    
              request.setCharacterEncoding("utf-8");
              response.setContentType("text/html;charset = utf-8");
              PrintWriter out = response.getWriter();
              out.println("<html><body bgcolor = beige>");
			  String deskMess = request.getParameter("desk");
			  double desk = Double.parseDouble(deskMess);
              String discountMess = request.getParameter("discount");
              double discount = Double.parseDouble(discountMess);
			  String billMess[]=request.getParameterValues("billMess");
			  String bims="";
             // String billMess = request.getParameter("billMess");
              if(billMess== null){
    
    
				  out.print("你没有选择菜单");
				  return;
				} 
			  else{
    
    
					  for (int k=0;k<billMess.length;k++){
    
    
						  bims+=billMess[k];
						  out.print("你的菜单: "+billMess[k]);
						}			
			  }
              double bill = getPriceSum(bims);
              double billDiscount = bill*(discount/10);
			  out.print("<h2>卓号:"+desk+"号桌");
              out.print("<h2>"+bims+"<br>一共消费:"+bill+"元");
              out.print("<br>优惠"+discount+"折后的金额:"+billDiscount+"元");
              out.print("</h2></body></html>");
         }
         public double getPriceSum(String input){
    
    
              Pattern pattern;
              Matcher matcher;
              String regex = "-?[0-9][0-9]*[.]?[0-9]*";
              pattern = Pattern.compile(regex);
              matcher = pattern.matcher(input);
              double sum = 0;
              while(matcher.find()){
    
    
                    String str = matcher.group();
                    sum += Double.parseDouble(str);
               }
               return sum;
           }
}

3.2.3 .将Example6_3_2_Servlet.java编译成Example6_3_2_Servlet.class

3、编写inputCircle.jsp,页面提供form表单,该form表单提供一个text文本框,用于用户输入圆的半径,用户单击submit提交键请求名字是computeArea的servlet。编写创建servlet的Servlet类,该类创建的servlet可以计算圆的面积。

inputCircle.jsp 运行结果如图:

在这里插入图片描述

提交运行结果:
在这里插入图片描述

3.3.1编写inputCircle.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
	
<html><body>
  <div>
	  <form action="computeArea" post="methon">
		 请输入圆的半径: <input type="text" name="radius" value="5"/>
		 <select name="mess">
   选择需要计算的属性<option value="area">面积</option>
		 </select>
		  <input type="submit" name="submit" value="提交噢" />
	  </form>		  
  </div>

</body></html>	

3.3.2编写computeArea_Servlet.java

package moon.sun;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.geom.*;
import javax.imageio.ImageIO;
public class computeArea_Servlet extends HttpServlet{
    
    
	HttpServletRequest request;
	HttpServletResponse response;
	public void init(ServletConfig config) throws ServletException{
    
    
		super.init(config);
	}
	public void service(HttpServletRequest request,HttpServletResponse response)throws IOException{
    
    
		this.request=request;
		this.response=response;
		request.setCharacterEncoding("utf-8");
		String mess=request.getParameter("mess");
		String radius=request.getParameter("radius");
		if(mess.equals("area")){
    
    
			getArea(Double.parseDouble(radius));
		}
	/*	else if(mess.equals("geometry")){
			getGeometry(Double.parseDouble(radius));
		}*/
	}
	void getArea(double r)throws IOException{
    
    
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		double area = Math.PI*r*r;
		String result = String.format("%.2f",area);
		out.print("<h2>半径"+r+"的圆的面积(保留两位小数):S="+result);
		//out.print(result);
		out.print("</h2></body></html>");
	}
	}
	/*void getGeometry(double r)throws IOException{
		response.setContentType("image/jpeg");
		Ellipse2D ellipse=new Ellipse2D.Double(30,30,2*r,2*r);
		BufferedImage image=getImage(ellipse);
		OutputStream outClient=response.getOutputStream();
		boolean boo=ImageIO.write(image,"jpeg",outClient);
	}
	BufferedImage getImage(Shape shape){
		int width=800,height=600;
		BufferedImage image=
		new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		Graphics g=image.getGraphics();
		g.fillRect(0,0,width,height);
		Graphics2D g_2d=(Graphics2D)g;
		g_2d.setColor(Color.blue);
		g_2d.fill(shape);
		return image;
	}
}*/

3.3.3.将computeArea_Servlet.java编译成computeArea_Servlet.class

部署 web.xml

       <servlet-name>computeArea</servlet-name>
       <servlet-class>moon.sun.computeArea_Servlet</servlet-class>
</servlet> 
<servlet-mapping>
        <servlet-name>computeArea</servlet-name>
        <url-pattern>/computeArea</url-pattern>
        </servlet-mapping>

4.要点提示:

1、.jsp页面文件的存储路径。
2、Servlet文件的编写、存储,.class文件的编译与存储。
classes>javac -cp servlet-api.jar X\Y\类名.java
3、web.xml文件的部署。

<?xml version="1.0" encoding="utf-8" ?>
<web-app>
    <servlet>
        <servlet-name>servlet对象名</servlet-name>
        <servlet-class>包名.Servlet类名</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name> servlet对象名</servlet-name>
<url-pattern>/用户请求servlet的格式</url-pattern>
    </servlet-mapping>
</web-app>

5.实验总结:

本实验学习总结:
1、servlet 的创建与运行
2、servlet工作原理: servlet 由 Tomcat服务器负责管理,Tomcat服务器通过读取web.xml,然后创建并运行
Init方法:
该方法是HttpServlet类中的方法,可以在子类中重写这个方法。init方法的声明格式是: public void"init(ServletConfig config) throws ServletExcception
servlet第一次被请求加载时,服务器创建一个servlet,这个对象调用init方法完成必要 的初始化工作。该方法在执行时,服务器会把一个SevletConfig类型的对象传递给init方法, 这个对象就被保存在servlet中,直到servlet被销毁。这个ServletConfig对象负责向servlet 传递服务设置信息,如果传递失败就会发生ServeletException,servlet就不能正常工作。
service方法:
该方法是HttpServlet类中的方法,可以在子类中直接继承该方法或重写这个方法。
service方法的声明格式是:
public void service(HttpServletRequest request HttpServletResponse response)
throw ServletException,I0Exception
当servlet 成功创建和初始化之后,调用service方法来处理用户的请求并返回响应。
Tomcat服务器将两个参数传递给该方法。一个是HttpServletRequest类型的对象,该对象封装了用户的请求信息,另外一个参数对象是HttpServletResponse类型的对象,该对象用来响应用户的请求。和init方法不同的是,init方法只被调用一次,而service方法可能被多次的调用。也就是说,当后续的用户请求该servlet时,Tomcat服务器将启动一个新的线程,在该线程中servlet调用service方法响应用户的请求,即每个用户的请求都导致service方法被调用执行,调用过程运行在不同的线程中,互不干扰。因此,不同线程的service方法中的局部变量互不干扰,一个线程改变了自己的service方法中局部变量的值不会影响其他线程的service方法中的局部变量。
destroy方法
该方法是HttpServlet类中的方法,子类可直接继承这个方法,一般不需要重写。destroy方法的声明格式是: public destroy()

实验六 MVC模式

1.实验目的:

掌握MVC模式三个部分的设计与实现

2.实验内容:

题目:设计一个Web应用,有一个JSP页面(show.jsp)、一个request bean(Test_Bean.class)和一个servlet(Test_Servlet.class)。JSP页面show.jsp提供一个表单,用户可以通过表单输入三角形的三边,提交给servlet控制器。bean负责存储三角形三边及面积,servlet控制器负责计算三角形的面积,并将结果存储到数据模型中,然后请求show.jsp页面显示request bean中的数据 。
要求:JavaBean的包为 jsp 页面所在web 服务目录的save.data;
Servlet的包为jsp页面所在web 服务目录的handle.data。
show.jsp保存在sh7文件夹下。
Test_Bean.class保存在sh7\WEB-INF\classes\save\data文件夹下。
Test_Servlet.class保存在sh7\WEB-INF\classes\handlee\data文件夹下。

3.实验过程:

show.jsp 运行结果图
在这里插入图片描述

3.1.1编写show.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<jsp:useBean id="triangleBean" class="save.data.Test_Bean" scope="request"/>
<style>
#tom{
    
    font-family: 宋体;font-size: 28px;color: black;}
</style>
<html><body bgcolor="beige">
<div>	
	<form action="triangleArea" id=tom method="post">
		<table>
			<tr>
				<td id="tom">请输入是三角形的三边:</td></tr>
			<tr><td id="tom">第一边:<input type="number" name="sideA" value="<%=triangleBean.getSideA()%>"/></td></tr>
			<tr><td id="tom">第二边:<input type="number" name="sideB" value="<%=triangleBean.getSideB()%>"/></td></tr>
			<tr><td id="tom">第三边:<input type="number" name="sideC" value="<%=triangleBean.getSideC()%>"/></td>
			</tr>
		</table>
					<tr><td><input type="submit" name="submit" id="tom" value="提交"/></td></tr>
	</form>
</div>
<p id="tom">
你输入的三边为:
<jsp:getProperty name="triangleBean" property="sideA"/><jsp:getProperty name="triangleBean" property="sideB"/><jsp:getProperty name="triangleBean" property="sideC"/><br/>
三角形的面积:S=
<jsp:getProperty name="triangleBean" property="area"/>
</p>
</body></html>

3.1.2编写Test_Bean.java
package save.data;
public class Test_Bean{
double sideA,sideB,sideC,area;
public void setSideA(double a){
sideA=a;
}
public double getSideA(){
return sideA;
}
public void setSideB(double b){
sideB=b;
}
public double getSideB(){
return sideB;
}
public void setSideC(double c){
sideC=c;
}
public double getSideC(){
return sideC;
}
public void setArea(double s){
area=s;
}
public double getArea(){
return area;
}
}

3.1.3编写Test_Servlet.java

package handle.data;
import save.data.Test_Bean;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Test_Servlet extends HttpServlet{
    
    
	public void init(ServletConfig config) throws ServletException{
    
    
		super.init(config);
	}
	public void doPost(HttpServletRequest request,
	HttpServletResponse response) throws ServletException,IOException{
    
    
		Test_Bean triangleBean=null;
		triangleBean=new Test_Bean();
		request.setAttribute("triangleBean",triangleBean);
		String A=request.getParameter("sideA");
		String B=request.getParameter("sideB");
		String C=request.getParameter("sideC");
		if(A==null||B==null||C==null)
			return;
		if(A.length()==0||B.length()==0||C.length()==0)
			return;
		double a=Double.parseDouble(A);
		double b=Double.parseDouble(B);
		double c=Double.parseDouble(C);
		double area=0;
		if(a+b>c&a+c>b&b+c>a){
    
    
			double p=(a+b+c)/2.0;
			area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
		}	
	//	else{
    
    
	//		out.print("???????????????????????????????????");
    //		}
		triangleBean.setSideA(a);
		triangleBean.setSideB(b);
		triangleBean.setSideC(c);
		triangleBean.setArea(area);
		RequestDispatcher dispatcher=
		request.getRequestDispatcher("show.jsp");
		dispatcher.forward(request,response);
	}
	public void doGet(HttpServletRequest request,
	HttpServletResponse response) throws ServletException,IOException{
    
    
		doPost(request,response);
	}
}

4.实验总结:

1、mvc 模式的生命周期与视图更新
在JSP+JavaBean模式中,由JSP页面通过使用useBean标记:
<jsp:useBean id="名字” class="创建bean的类” scope=“生命周期”/>
创建bean。
而在MVC模式中,由控制器servlet创建bean,并将有关数据存储到所创建的bean中,然后servlet请求某个JSP页面使用getProperty动作标记:
<jsp:getProperty name=“名字” property= “bean的属性”/>
显示bean中的数据。
在MVC模式中,当用控制器servlet创建bean时,就可以使用bean类的带参数的构造方法。类中的方法的命名继续保留getXxx规则,但可以不遵守setXxx规则
request bean
①bean的创建
servlet创建request bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean = new BeanClass();
(2) 将所创建的bean对象存放到HttpServletRequest对象request中,并指定查找该bean的 id。该步骤决定了bean为request bean。例如:
request. setAttribute(“keyWord”, bean);
②视图更新
servlet请求一个JSP页面,例如show.jsp的代码如下:
RequestDispatcher dispatcher - request. getRequestDispatcher(“show.jsp”);
dispatcher. forward(request, response);
servlet所请求的JSP页面,例如show.jsp页面可以使用如下标记获得servlet所创建的 request bean:
<jsp:useBean id = "keyWord"class= “save. data. BeanClass” scope= “request”/>
id的值是servlet创建request bean时,为bean指定的关键字。然后JSP页面可以使用相 应的标记或Java程序片显示该request bean中的数据,例如使用:
<jsp:getProperty name= “keyWord” property= “bean的变量”/>
标记显示request bean中的数据。如果上述代码执行成功,用户就看到了show.jsp页面显示 request bean中的数据的效果。

session bean
① bean的创建
servlet创建session bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean= new BeanClass();
(2)将所创建的bean对象存放到HttpServletSession对象session中,并指定查找该
bean的id。该步骤决定了bean 为session bean。例如:
HttpSession session s request.getSession(true);
session. setAttribute(“keyWord”, bean);
内置对象执行上述操作,就会把bean存放到Tomcat服务器管理的内置pageContext中,该bean被指定的id是key Word,生命周期是PageContext. SESSION_SCOPEsession)。
②视图更新
servlet创建bean的步骤(2)决定了bean为session bean,只要用户的session没有消失,该session bean就一直存在。Web服务目录的各个JSP都可以使用
<jsp:useBean id- "keyWord"class = “save. data BeanClass” scope- “session”/>
标记获得servlet所创建的session bean(id的值是servlet创建session bean时,为bean指定的关键字),然后使用相应的标记或程序片显示该session bean中的数据,例如使用
<jsp:getProperty name= “keyWord” property=“bean的变量”>
标记显示该session bean中的数据。
对于session bean,如果servlet希望某个JSP显示其中的数据,可以使用
RequestDispatcher对象转发到该页面,也可以使用HttpServletResponse类中的重定向方法 (sendRedirect)定向到该页面。
不同用户的session bean是互不相同的,即占有不同的内存空间。
application bean
① bean的创建
servlet 创建application bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean = new BeanClass();
(2) servlet使用getServletContext()方法返回服务器的ServletContext内置对象的引
用,将所创建的bean对象存放到服务器这个ServletContext内置对象中,并指定查找该bean的关键字。该步骤决定了bean的生命周期为application。例如:
getServletContext(). setAttribute(“keykord”, bean);
这样就会把bean存放到Tomcat服务器管理的内置对象pageContext中,该bean被指定的id是key Word,生命周期是 PageContext. APPLICATION_SCOPE(application)。
视图更新
servlet创建bean的步骤(2)决定了bean 为application bean。 当servlet创建application bean后,只要Tomcat服务器不关闭,该bean就一直存在。一个用户在访问Web服务目录的各个JSP中都可以使用
<ispcuseBean idz"keyiord’class- “save. data. Beanclass” scope “application”/>
标记获得servlet所创建的application bean(id的值是servlet创建application bean 时为bean指定的关键字),然后使用相应的标记或程序片显示该application bean中的数据,例如使用
<jspgetProperty name- “keyWord” property-“bean 的变量”/>
标记显示该application bean中的数据。
对于application bean,如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重 定向方法(sendRedirect)。
所有用户在同一个Web服务目录中 的application bean是相同的,即占有相同的内存空间。

实验七 JSP中使用数据库

1.实验目的:

掌握JSP中使用数据库

2.实验内容:

使用MVC结构,设计一个用户注册的Web应用程序。

3.实验过程:

register.jsp 运行结果如图
在这里插入图片描述

注册信息写入数据库中储存
在这里插入图片描述

3.1.1建立数据库teachdb 并在数据库下面建表userlist

在这里插入代码片

3.1.2编写register.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
	<jsp:useBean id="userBean" class="hybean.data.RegisterBean" scope="request"/>
<title>注册页面</title>
<style>
#tom{
    
    font-family: 宋体;font-size: 20px;color: black;}
</style>
<html><body background="./img/bg1.jpg">
<div align="center">
	<h2>注册</h2>
	<form action="registerses" method="post">
		<table id=tom>
			<span id="tom">用户名由字母、数字、下划线构成;*注释项为必须填写项</span>
			<tr><td>*用 户 名:</td><td><input type="text" id="tom" name="username"/></td></tr>
			<tr><td>*输入密码:</td><td><input type="text" id="tom" name="pwd"/></td></tr>
			<tr><td>*重复密码:</td><td><input type="text" id="tom" name="again_pwd"/></td></tr>
			<tr><td>*电话:</td><td><input type="text" id="tom" name="phone"/></td></tr>
		</table>
		<br>
		<input type="submit" name="submit" value="提交注册" id="tom"/>
	</form>
</div>	
<div align="center">
	<span id="tom">注册反馈:</span>
	<jsp:getProperty name="userBean" property="backNews"/>
	<table id="yes" border="3">
		<tr><td>用户名:</td><td width="250px"><jsp:getProperty name="userBean" property="username"/></td></tr>
		<tr><td>密码:</td><td><jsp:getProperty name="userBean" property="pwd"/></td></tr>
		<tr><td>电话:</td><td><jsp:getProperty name="userBean" property="phone"/></td></tr>
	</table>
</div>
</body> </html>
	

3.1.2编写RegisterBean.java

package hybean.data;
public class RegisterBean{
    
    
	String username="",
			pwd="",
			phone="",
			backNews="请输入信息";
	public void setUsername(String username){
    
    
		this.username=username;
	}
	public String getUsername(){
    
    
		return username;
	}
	public void setPhone(String phone){
    
    
		this.phone=phone;
	}
	public String getPhone(){
    
    
		return phone;
	}
	public void setPwd(String pwd){
    
    
		this.pwd=pwd;
	}
	public String getpwd(){
    
    
		return pwd;
	}
	public void setBackNews(String backNews){
    
    
		this.backNews=backNews;
	}
	public String getBackNews(){
    
    
		return backNews;
	}
}

3.1.3编写
Servlet 类 registerses.java

package hyservlet.data;
import hybean.data.RegisterBean;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class registerses extends HttpServlet{
    
    
 public void init(ServletConfig config) throws ServletException
 {
    
    
     super.init(config);
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
 {
    
    
  RegisterBean userBean = new RegisterBean();  //????JavaBean????
  request.setAttribute("userBean",userBean);
  String username = request.getParameter("username");
  String pwd = request.getParameter("pwd");
  String again_pwd = request.getParameter("again_pwd");
  String phone = request.getParameter("phone");
  String backNews="";
  if(username==null||pwd==null||again_pwd==null||phone==null) 
  {
    
    
	  backNews="请输入注册信息";
	  userBean.setBackNews(backNews);
	  return;
  }
  if(pwd.equals(again_pwd)){
    
    
	  backNews="恭喜您注册成功";
	  userBean.setBackNews(backNews);
//--------------?????????-------------------------------
   Connection con = null;
   Statement sql;
   ResultSet rs;
   try 
   {
    
    
	   Class.forName("com.mysql.cj.jdbc.Driver");
	      }
	      catch(Exception e)
	      {
    
    
	       System.out.print("<h1>"+e);
	      }
	      
	       String url="jdbc:mysql://localhost:3306/teachdb?"+"useSSL=false&serverTimezone=CST&characterEncoding=utf-8";
	       String user="root";
	       String password="******";
	      //?????????
	       try {
    
    
	       con=DriverManager.getConnection(url,user,password);
	       sql=con.createStatement();
	       String insertSQL = "insert into userlist(username,pwd,phone) values('"+username+"','"+pwd+"','"+phone+"')";
	         //???????????
	       int ok=sql.executeUpdate(insertSQL);
	       con.close();
	       }
	       catch(SQLException exp)
	       {
    
    
	        backNews="该用户名已被使用,请更换您的用户名"+exp;
			userBean.setBackNews(backNews);
	        }
			
	     }
		 
	     else 
	     {
    
    
	      backNews="两次输入的密码不一致请重新输入确保两次密码完全一致";
		  userBean.setBackNews(backNews);
		  RequestDispatcher dispatcher = request.
		  getRequestDispatcher("register.jsp");
		  dispatcher.forward(request,response);
		  return;
	     }
	     userBean.setUsername(username);
	     userBean.setPwd(pwd);
	     userBean.setPhone(phone);
	     //????jsp??????bean????????
	     RequestDispatcher dispatcher = request.
		 getRequestDispatcher("register.jsp");
		   dispatcher.forward(request,response);
		  }
	public void doGet(HttpServletRequest request,
	HttpServletResponse response)throws ServletException,IOException{
    
    
		doPost(request,response);
	}
}

Registerses.java

package hyservlet.data;
import hybean.data.RegisterBean;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class registerS extends HttpServlet{
    
    
 public void init(ServletConfig config) throws ServletException
 {
    
    
     super.init(config);
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
 {
    
    
  RegisterBean userBean = new RegisterBean();  //????JavaBean????
  request.setAttribute("userBean",userBean);
  String username = request.getParameter("username");
  String pwd = request.getParameter("pwd");
  double dou1 = Double.parseDouble(pwd);
  String again_pwd = request.getParameter("again_pwd");
  double dou2 = Double.parseDouble(again_pwd);
  String phone = request.getParameter("phone");
  String backNews="";
  if(username==null||pwd==null||again_pwd==null||phone==null) 
  {
    
    
	  backNews="????????????";
	  userBean.setBackNews(backNews);
	  return;
  }
  if(dou1==dou2) 
  {
    
    
//--------------?????????-------------------------------
   Connection con = null;
   Statement sql;
   ResultSet rs;
   try 
   {
    
    
	   Class.forName("com.mysql.cj.jdbc.Driver");
	      }
	      catch(Exception e)
	      {
    
    
	       System.out.print("<h1>"+e);
	      }
	      
	       String url="jdbc:mysql://localhost:3306/teachdb?"+"useSSL=false&serverTimezone=CST&characterEncoding=utf-8";
	       String user="root";
	       String password="hhhhhh";
	      //?????????
	       try {
    
    
	       con=DriverManager.getConnection(url,user,password);
	       sql=con.createStatement();
	       String insertSQL = "insert into userlist(username,pwd,phone) values('"+username+"','"+pwd+"','"+phone+"')";
	         //???????????
	       int ok=sql.executeUpdate(insertSQL);
	       con.close();
	       }
	       catch(SQLException e)
	       {
    
    
	        System.out.print("<h3>"+e);
	        }
	     }
	     else 
	     {
    
    
	      System.out.print("???????????????????????????????");
	     }
	     userBean.setUsername(username);
	     userBean.setPwd(pwd);
	     userBean.setPhone(phone);
	     //????jsp??????bean????????
	     RequestDispatcher dispatcher = request.
		 getRequestDispatcher("register.jsp");
		   dispatcher.forward(request,response);
		  }
	public void doGet(HttpServletRequest request,
	HttpServletResponse response)throws ServletException,IOException{
    
    
		doPost(request,response);
	}
}

编译bean 和servlet文件

部署web.xml 保存到WEB-INF 子目录中

<?xml version="1.0" encoding="utf-8"?>
<web-app>
<!--register2.jsp -->
	<servlet>
		<servlet-name>registerses</servlet-name>
		<servlet-class>hyservlet.data.registerses</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>registerses</servlet-name>
		<url-pattern>/test7/registerses</url-pattern>
	</servlet-mapping>
</web-app>

4.实验总结:

1、连接数据库
⑴ 加载JDBC-MYSQL 数据库连接器
try {Class.forName(“com.mysql.cj.jdbc.Driver”);
}
catch(Exception e)
{
System.out.print("

"+e);
}

连接数据库

String url=“jdbc:mysql://localhost:3306/数据库名字?”+“useSSL=false&serverTimezone=CST&characterEncoding=utf-8”;
String user=“root”;
String password="******";
//???
try {
con=DriverManager.getConnection(url,user,password);
sql=con.createStatement();
//执行sql语句 例如添加
sql=con.createStatement();
String insertSQL = “insert into userlist(username,pwd,phone) values(’”+username+"’,’"+pwd+"’,’"+phone+"’)";
// 调用执行sql 语句
int ok=sql.executeUpdate(insertSQL);
con.close();
}
catch(SQLException exp)
{

实验八 JSP中使用数据库

1、实验目的:

掌握JSP中使用数据库

2、实验内容:

创建Student数据库,包含表scoreReport,此表各字段及意义如下 :
id(char) :存放学号,主键;
name(char):存放姓名;
mathScore(int):存放数学成绩;
englishScore(int):存放英语成绩。
编写jsp页面,实现按姓名查询成绩与按学号查询成绩。
在这里插入图片描述
在这里插入图片描述

3、实验过程:

创建数据库teachdb 并在下面建表scoreReport 再录入学生成绩数据

create table scoreReport(id char(20) not null,
                            name char(30) character set gb2312,
                            mathScore int,
                            englishScore int,
                            prinmary key(id);
)

在这里插入图片描述

inputNumber.jsp运行结果:
在这里插入图片描述

提交到querShow.jsp 查询结果
在这里插入图片描述

3.1.1编写inputNumber.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
<style>
#tom{
    
    
	font-family: 宋体;font-size: 28px;color: black;
}
</style>
<html><body bgcolor="blanchedalmond">
<div>
	<h2>输入学号或姓名查询成绩:</h2>
	<form action="queryShow.jsp" id="tom" method="post">
		<input type="text" name="mess" id="tom"/><br>
		<input type="submit" name="submit" id="tom" value="按姓名查询"/>
		<input type="submit" name="submit" id="tom" value="按学号查询"/>
	</form>
</div>
</body></html>

3.1.2编写querShow.jsp

<%@ page contentType="text/html"%>
<%@ page pageEncoding="utf-8"%>
<%@ page import="java.sql.*"%>
	<style>
	#tom{
    
    
		font-family: 宋体;font-size: 20px;color: black;
	}
	</style>
<html><body bgcolor="beige">
<div>
	
<%   //获取提交的属性值
	request.setCharacterEncoding("utf-8");
	String mess=request.getParameter("mess");
	mess=mess.trim();
	String submit=request.getParameter("submit");
	if(mess.length()==0){
		response.sendRedirect("inputNumber.jsp");
		return;
	}
	//连接数据库
	Connection con=null;
	Statement sql;
	ResultSet rs;
	try{
		//加载jabc-mysql 8.0 连接器
		Class.forName("com.mysql.cj.jdbc.Driver");
		}
		//返回连接异常信息
		catch(Exception e){  
			out.print("<p id=tom>"+e);
	}
		String url="jdbc:mysql://localhost:3306/teachdb?"+
		"useSSL=false&serverTimezone=CST&characterEncoding=utf-8";
		String user="root";
		String password="******";
		out.print("<table border=1>");
		out.print("<tr>");
		out.print("<th id=tom width=100>"+"学号"+"</th>");
		out.print("<th id=tom width=100>"+"姓名"+"</th>");
		out.print("<th id=tom width=100>"+"数学成绩"+"</th>");
		out.print("<th id=tom width=100>"+"英语成绩"+"</th>");
		out.print("</tr>");
		//连接数据库
		try{con = DriverManager.getConnection(url,user,password);
		sql=con.createStatement();
		String SQL=null;
		if(submit.contains("姓名")){
			SQL="SELECT * FROM scorereport WHERE name like '%"+mess+"%'";	
		}
		else if(submit.contains("学号")){
			SQL="SELECT * FROM scorereport WHERE id='"+mess+"'";
		}
		rs=sql.executeQuery(SQL);
		while(rs.next()){
			out.print("<tr>");
			out.print("<td id=tom>"+rs.getString(1)+"</td>");
			out.print("<td id=tom>"+rs.getString(2)+"</td>");
			out.print("<td id=tom>"+rs.getInt(3)+"</td>");
			out.print("<td id=tom>"+rs.getInt(4)+"</td>");
			out.print("</tr>");
		}
		out.print("</table>");
		con.close();
		}
		catch(SQLException e){
			out.print("<h3>"+e+"</h3>");
		}
	%>
</div>
</body></html>

4.实验总结:

本实验通过对数据库连接的加强练习 ,对数据库 mysql 与java /jsp 的连接使用有进一步加深。
⑴ 加载JDBC-MYSQL 数据库连接器
try {Class.forName(“com.mysql.cj.jdbc.Driver”); }
catch(Exception e)
{ System.out.print("

"+e); }
连接池的使用
(1)建立连接池

(2)使用连接池
1.Context 接口
Context context=new InitialContext();
Context contextNeeded = (Context)context.lookup(“java:comp/env”)
2.得到连接池
DataSource ds =(DataSource)contextNeeded.lookuo(“连接池中的name值”)
3.获得连接
Context con = ds.getContextion();
4.将连接返回连接池
con.close();

欢迎观阅 !

猜你喜欢

转载自blog.csdn.net/hjjshua/article/details/123703537