JavaBean简介及设计原则
Javabeans就是符合某种特定的规范的Java类。使用Javabeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高了代码的维护性。
例如下面的学生类 ,就是符合Javabeans的设计原则的Javabeans类
什么是JSP动作元素
JSP动作元素(action elements),动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性,可选的内容,与开始标签匹配的结束标签。
第一类是与存取JavaBean有关的,包括:
<jsp:useBean><jsp:setProperty><jsp:getProperty>
第二类是JSP1.2就开始有的基本元素,包括6个动作元素
<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>
第三类是JSP2.0新增加的元素,主要与JSP Document有关,包括六个元素
<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
第四类是JSP2.0新增的动作元素,主要是用来动态生成XML元素标签的值,包括3个动作
<jsp:attribute><jsp:body><jsp:element>
第五类是JSP2.0新增的动作元素,主要是用在Tag File中,有2个元素
<jsp:invoke><jsp:dobody>
使用普通方式创建JavaBean
在Jsp页面中如何使用Javabeans
1.像使用普通java类一样,创建javabean实例
新建工程
Users类
package com.po;
/*
* 用户类
*
*/
public class Users {
private String username;//用户名
private String password;//密码
//保留此默认的构造方法
public Users() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
index.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.po.Users" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Users user = new Users();
user.setUsername("admin");//设置用户名
user.setPassword("123456");//设置密码
%>
<h1>使用普通方式创建javabean的实例</h1>
<hr>
用户名:<%=user.getUsername() %><br>
密码:<%=user.getPassword() %><br>
</body>
</html>
2.在Jsp页面中通常使用jsp动作标签使用javabean。
userBeans动作
<jsp:userBeans>
作用:在jsp页面中实例化或者在指定范围内使用javabean:
<jsp:userBean id="标示符" class="java类名" scope="作用范围" />
setProperty动作
<jsp:setProperty>
作用:给已经实例化的Javabean对象的属性赋值,一共有四种形式
<jsp:setProperty name="JavaBean实例名" property="*" /> (跟表单关联)
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" /> (跟表单关联)
<jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" value="BeanValue" />(手工设置)
<jsp:setProperty name="JavaBean实例名" property="propertyName" param="request对象中的参数名 " />(跟request参数关联)
代码示例:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>系统登录</h1>
<hr>
<form name="loginForm" action="dologin.jsp?mypass=999999" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录" /></td>
</tr>
</table>
</form>
</body>
</html>
dologin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"></jsp:useBean>
<h1>setProperty动作元素</h1>
<hr>
<!-- 根据表单自动匹配所有的属性 -->
<%-- <jsp:setProperty name="myUsers" property="*" /> --%>
<!-- 根据表单匹配部分的属性 -->
<%-- <jsp:setProperty property="username" name="myUsers"/> --%>
<!-- 跟表单匹无关,通过手工赋值给属性 -->
<%-- <jsp:setProperty property="username" name="myUsers" value="Lisi"/>
<jsp:setProperty property="password" name="myUsers" value="888888"/> --%>
<!-- 通过URL传参数给属性赋值 -->
<jsp:setProperty property="password" name="myUsers" param="mypass" />
用户名:<%=myUsers.getUsername()%><br>
密码:<%=myUsers.getPassword()%><br>
</body>
</html>
getProperty动作
<jsp:getProperty>
作用:获取指定Javabean对象的属性值
<jsp:getProperty name="JavaBean实例名" property="属性名" />
代码示例:
修改dologin.jsp
<!-- 使用传统的表达式方式来获取用户名和密码 -->
<%-- 用户名:<%=myUsers.getUsername()%><br>
密码:<%=myUsers.getPassword()%><br> --%>
<!-- 使用getProperty方式来获取用户名和密码 -->
用户名:<jsp:getProperty property="username" name="myUsers"/> <br>
密码:<jsp:getProperty property="password" name="myUsers"/> <br>
JavaBean四个作用域范围
说明:使用userBeans的scope属性可以用来指定javabean的作用范围。
application //可以通过application.getAttribute()方法取得Javabean对象。
代码示例
login.jsp页面保持原代码
修改dologin.jsp页面 scope=”application” ,并添加一个超链接
<a href="testScope.jsp">测试javabean的四个作用域范围</a>
dologin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.po.Users" scope="application"></jsp:useBean>
<h1>setProperty动作元素</h1>
<hr>
<!-- 使用getProperty方式来获取用户名和密码 -->
用户名:<jsp:getProperty property="username" name="myUsers"/> <br>
密码:<jsp:getProperty property="password" name="myUsers"/> <br>
<br>
<br>
<a href="testScope.jsp">测试javabean的四个作用域范围</a>
</body>
</html>
testScope.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.po.Users" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>JavaBean的四个作用域范围</h1>
<hr>
<jsp:useBean id="myUsers" class="com.po.Users" scope="application"></jsp:useBean>
用户名:<jsp:getProperty property="username" name="myUsers" />
<br>
密码:<jsp:getProperty property="password" name="myUsers" />
<br>
<!-- 使用内置对象获取用户名和密码 -->
<hr>
用户名:<%=((Users)application.getAttribute("myUsers")).getUsername() %>
<br>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword() %>
<br>
</body>
</html>
session //可以通过HttpSession.getAttribute()方法取得JavaBean对象。
代码示例
修改dologin.jsp页面 scope=”session”
<jsp:useBean id="myUsers" class="com.po.Users" scope="session"></jsp:useBean>
修改testScope.jsp页面
<jsp:useBean id="myUsers" class="com.po.Users" scope="session"></jsp:useBean>
用户名:<%=((Users)session.getAttribute("myUsers")).getUsername() %>
<br>
密码:<%=((Users)session.getAttribute("myUsers")).getPassword() %>
request //可以通过HtppRequest.getAttribute()方法取得JavaBean对象。
代码示例
修改dologin.jsp页面 scope=”request”
<jsp:useBean id="myUsers" class="com.po.Users" scope="request"></jsp:useBean>
修改testScope.jsp页面
<jsp:useBean id="myUsers" class="com.po.Users" scope="request"></jsp:useBean>
用户名:<%=((Users)request.getAttribute("myUsers")).getUsername() %>
<br>
密码:<%=((Users)request.getAttribute("myUsers")).getPassword() %>
我们发现获取不到用户名和密码了,原因是dologin.jsp下面的超链接相当于请求重定向,相当于在dologin.jsp当中重新发起了一次请求。所以testScope.jsp并没有myUsers的javabean对象实例。
那么如何使用session的作用域来获取呢,我们就不能使用请求重定向了,需要使用服务器的内部转发。
我们修改dologin.jsp文件
<br>
<a href="testScope.jsp">测试javabean的四个作用域范围</a>
<%
request.getRequestDispatcher("testScope.jsp").forward(request, response);
%>
经过测试,可以获取到。
page //仅在当前页面有效
修改dologin.jsp页面 scope=”page”
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"></jsp:useBean>
修改testScope.jsp文件
<%
String username="";
String password="";
if(pageContext.getAttribute("myUsers")!=null){
username=((Users)pageContext.getAttribute("myUsers")).getUsername();
password=((Users)pageContext.getAttribute("myUsers")).getPassword();
}
%>
用户名:<%=username %>
<br>
密码:<%=password %>
那么,testScope页面是无论如何都获取不到的。
Model1简介
Model1模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应。
弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序的可拓展性和可维护性非常差。
Javabean的出现可以使jsp页面中使用Javabean封装的数据或者调用Javabean的业务逻辑代码,这样大大提升了程序的可维护性。
Model1就是Jsp + JavaBean
阶段项目:
使用Jsp + javabean完成用户登录功能
在上一篇文章中JAVA遇见HTML—JSP篇(三.JSP内置对象)
的最后的阶段项目中,我们实现了项目效果。现在我们在其基础上进行修改。
创建com.po包,Users.java类
package com.po;
//用户类
public class Users {
private String username;
private String password;
public Users() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
创建com.dao包,UsersDAO.java类
package com.dao;
import com.po.Users;
//用户逻辑类
public class UsersDAO {
//用户登录方法
public boolean usersLogin(Users u) {
if("admin".equals(u.getUsername()) && "admin".equals(u.getPassword())) {
return true;
}else {
return false;
}
}
}
修改dologin.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="loginUser" class="com.po.Users" scope="page"></jsp:useBean>
<jsp:useBean id="userDAO" class="com.dao.UsersDAO" scope="page"></jsp:useBean>
<jsp:setProperty property="*" name="loginUser"/>
<%
String username="";
String password="";
request.setCharacterEncoding("utf-8");//防止中文乱码
username = request.getParameter("username");
password = request.getParameter("password");
//如果用户和密码都等于admin,则登录成功
if(userDAO.usersLogin(loginUser)){
System.out.println("成功");
session.setAttribute("loginUser", loginUser.getUsername());
request.getRequestDispatcher("login_success.jsp").forward(request,response);
}else{
System.out.println("失败");
response.sendRedirect("login_failure.jsp");
}
%>
其他页面不动。