JavaBean——四舍五入(保留一定的小数),MVC设计模式,EL表达式和JSTL标签快速入门,软件三层架构设计

1、什么是JavaBean

JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
  • 这个Java类必须具有一个无参的构造函数
  • 属性必须私有化。
  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。

属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。 

属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。 

一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。

2、在JSP中使用JavaBean

JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:
  • <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。
  • <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
  • <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。

(1)、<jsp:useBean>标签

<jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象:
  • 如果存在则直接返回该JavaBean对象的引用。
  • 如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。 
常用语法:
<jsp:useBean id="beanName" class="package.class" 
scope="page|request|session|application"/>

  • id属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称。
  • class属性用于指定JavaBean的完整类名(即必须带有包名)
  • scope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page。

执行原理:
<jsp:useBean id="currentDate" class="java.util.Date"/>
翻译成servlet源码:

java.util.Date currentDate = null;
synchronized (_jspx_page_context) {
	currentDate = (java.util.Date) 			   	   	_jspx_page_context.getAttribute(
				"currentDate", PageContext.PAGE_SCOPE);
	if (currentDate == null){
		currentDate = new java.util.Date();
		_jspx_page_context.setAttribute("currentDate",
				currentDate, PageContext.PAGE_SCOPE);
	}
}

小注:
<jsp:useBean ...> 
		Body 
</jsp:useBean> 

功能:
Body部分的内容只在<jsp:useBean>标签创建JavaBean的实例对象时才执行。

(2)、<jsp:setProperty>标签 

<jsp:setProperty name="beanName" 

property="propertyName" value="{string | <%= expression %>}" |
property="propertyName" [ param="parameterName" ] | 
property= "*" 
}/>


  • name属性用于指定JavaBean对象的名称。 
  • property属性用于指定JavaBean实例对象的属性名。
  • value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。  
  • param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。 
  • property= "*" 各个属性全部封装

注:
     jsp:setProperty标签在工作时,它会自动把字符串转成八种基本数据类型 
     
        但是jsp:setProperty标签对于复杂类型无法自动进行转换 

<!-- jsp:setProperty标签用所有的请求参数为bean的属性赋值 -->
     <!-- http://localhost:8080/day09/2.jsp?name=flx&password=123&age=34 -->
     <jsp:setProperty name="person" property="*"/>
    
    <% 
    	System.out.println(person.getName());
    	System.out.println(person.getPassword());
    	System.out.println(person.getAge());
%>

(3)、<jsp:getProperty>标签 

<jsp:getProperty>标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中
语法:
<jsp:getProperty name="beanInstanceName" property="PropertyName" />


  • name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同。 
  • property属性用于指定JavaBean实例对象的属性名。
  • 如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。一般需要判断,为null就不输出了。

3、JSP开发模式

SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式:
  • 一种是JSP+JavaBean模式(不用)
  • 一种是Servlet+JSP+JavaBean模式。
(1)、JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据。

(2)、Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP、JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。servlet->jsp 利用forward技术,数据存在request域中。


第一种开发模式开发计算器:
CalculatorBean:
package seu.xinci.pojo;

import java.math.BigDecimal;

/**
 * Created by Administrator on 2016/1/31.
 */
public class CalculatorBean {

    private double firstNumber;
    private double secondNumber;
    private char operator='+';
    private double result;

    public double getFirstNumber() {
        return firstNumber;
    }

    public void setFirstNumber(double firstNumber) {
        this.firstNumber = firstNumber;
    }

    public double getSecondNumber() {
        return secondNumber;
    }

    public void setSecondNumber(double secondNumber) {
        this.secondNumber = secondNumber;
    }

    public char getOperator() {
        return operator;
    }

    public void setOperator(char operator) {
        this.operator = operator;
    }

    public double getResult() {
        return result;
    }

    public void setResult(double result) {
        this.result = result;
    }

    public void calculate(){
        switch (this.operator){
            case '+':{
                this.result = this.firstNumber + this.secondNumber;
                break;
            }

            case '-':{
                this.result = this.firstNumber - this.secondNumber;
                break;
            }

            case '*':{
                this.result = this.firstNumber * this.secondNumber;
                break;
            }

            case '/':{
                if (this.secondNumber==0)
                    throw new RuntimeException("被除数不能为0");
                this.result = this.firstNumber / this.secondNumber;
                this.result = new BigDecimal(this.result).setScale(2,BigDecimal.ROUND_HALF_UP)
                        .doubleValue();
                break;
            }

            default:
                throw new RuntimeException("对不起,传入的运算符非法!!");
        }
    }
}

calculator.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>计算器</title>
  </head>
  
  <body style="text-align: center;">
    
    <jsp:useBean id="CalculatorBean" class="cn.itcast.CalculatorBean"></jsp:useBean>
    <jsp:setProperty name="CalculatorBean" property="*"/>
    <% 
    	CalculatorBean.calculate();
    %>
    
    <br/><hr> <br/>
    
    计算结果是:
    <jsp:getProperty name="CalculatorBean" property="firstNum"/>
    <jsp:getProperty name="CalculatorBean" property="operator"/>
    <jsp:getProperty name="CalculatorBean" property="secondNum"/>
      =
    <jsp:getProperty name="CalculatorBean" property="result"/>
       
      
     <br/><hr> <br/>
    
    <form action="/day09/calculator.jsp" method="post">
    <table border="1" width="50%">
    	<tr>
    		<td colspan="2">简单的计算器</td>
    	</tr>
    	
    	<tr>
    		<td>第一个参数</td>
    		<td>
    			<input type="text" name="firstNum">
    		</td>
    	</tr>
    	
    	<tr>
    		<td>运算符</td>
    		<td>
    			<select name="operator">
    				<option value="+">+</option>
    				<option value="-">-</option>
    				<option value="*">*</option>
    				<option value="/">/</option>
    			</select>
    		
    		</td>
    	</tr>
    	
    	<tr>
    		<td>第二个参数</td>
    		<td>
    			<input type="text" name="secondNum">
    		</td>
    	</tr>
    	
    	<tr>
    		<td colspan="2">
    			<input type="submit" value="计算">
    		</td>
    	</tr>
    
    </table>
    </form>
    
    
  </body>
</html>

注意:
   1、处理了/0的情况,在“/”操作的时候,判断被除数是否为0,如果是0则抛出异常(异常处理[ errorPage="relative_url" ] ,其中relative_url为用来处理异常的页面)
   2、四舍五入,保留一定位数的小数
this.result = new BigDecimal(this.result).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

4、EL表达式快速入门

       EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象(page、request、session、application)中获取对象。
        如果域对象中不存在标识符所对应的对象,则返回结果为””(注意,不是null)(不用自己进行判断)

(1)示例:使用EL表达式获取page、request、session、appliction域中的数据。
<% 
	request.setAttribute("name","aaa");
%>

<!-- pageContext.findAttribute("name")   page request session application-->
${name } 


(2)、EL表达式中也可以使用${customerBean.address}的形式来访问JavaBean对象的属性。
示例:使用EL表达式获取Bean属性。
<!-- 在jsp页面中,使用el表达式可以获取bean的属性 -->
<% 
	Person p = new Person();
	p.setAge(12);
	request.setAttribute("person",p);
%>
${person.age }

<!-- 在jsp页面中,使用el表达式可以获取bean中的。。。。。。。。。的属性 -->
<% 
	Person person = new Person();
	Address address = new Address();
	person.setAddress(address);
	
	request.setAttribute("person",person);
%>
${person.address.name }

(3)、list集合指定数据
<!-- 在jsp页面中,使用el表达式获取list集合中指定位置的数据 -->
<% 
	Person p1 = new Person();
	p1.setName("aa111");
	
	Person p2 = new Person();
	p2.setName("bb");
	
	List list = new ArrayList();
	list.add(p1);
	list.add(p2);
	
	request.setAttribute("list",list);
%>

${list[0].name }

(4)、map集合指定数据
<!-- 在jsp页面中,使用el表达式获取map集合的数据 -->

<% 
	Map map = new HashMap();
	map.put("a","aaaaxxx");
	map.put("b","bbbb");
	map.put("c","cccc");
	
	map.put("1","aaaa1111");
	
	request.setAttribute("map",map);
%>

${map.a }
${map["1"] }

结合JSTL标签,EL表达式也可轻松获取各种集合中的元素。

<!-- 利用el表达式获取web应用的名称 -->
<a href="${pageContext.request.contextPath }/1.jsp">点点</a>

EL表达式也可使用类如${1==1}的形式进行简单的逻辑判断。

<!-- 注意:如果访问bean不存在的属性,会抛 Property 'username' not found on type cn.itcast.Person -->
<%-- ${person.username }--%>

5、JSTL标签快速入门

JSTL是sun公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码。

在页面中使用JSTL标签需完成以下2个步骤:
1、导入jstl.jar和standerd.jar这两个JSTL的jar文件。
2、在JSP页面中使用<%@ tablib url=“”  prifix=“” %>元素导入标签库。

JSTL标签库中常用标签:
<c:foreach var=“” items=“”>
<c:if test=“”>

实例:
(1)、list的迭代:
<!-- 使用jstl+el表达式可以迭代list集合 -->
<% 
	Person p1 = new Person();
	p1.setName("aa111");
	
	Person p2 = new Person();
	p2.setName("bb");
	
	List list = new ArrayList();
	list.add(p1);
	list.add(p2);
	
	request.setAttribute("list",list);
%>

<c:forEach var="person" items="${list}">
	${person.name }<br/>
</c:forEach>

(2)、map的迭代:
<!-- 使用jstl+el表达式可以迭代map集合 -->
<% 
	Map map = new HashMap();
	map.put("a","aaaaxxx");
	map.put("b","bbbb");
	map.put("c","cccc");
	map.put("1","aaaa1111");
	
	request.setAttribute("map",map);
%>

<br/>

<%-- Set<Map.Entry> set = map.entrySet()--%>
<c:forEach var="me" items="${map}">  
	${me.key } = ${me.value }<br/>
</c:forEach>

(3)、c:if的使用:
<c:if test="${user!=null}">
	欢迎您:${user.uesrname }
</c:if>

 <c:if test="${user==null}">
	用户名:<input type="text" name="username">
	密码:<input type="password" name="password">
	<input type="submit" value="登陆">
</c:if>



注意:常犯错误
1、忘记写<%@ tablib url=“”  prifix=“” %>元素导入标签库,不会报错但是会显示不出来!即标签体无效





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章