在JSP 的各種Web框架中,據(jù)我看來Struts框架最為簡(jiǎn)單。下面從Struts框架開始來研究JSP的web框架。
1、MVC
在研究這個(gè)框架之前,先要對(duì)MVC模式有所了解。幸好以前學(xué)習(xí)過設(shè)計(jì)模式,對(duì)MVC編程和模式了解一些,即將模型、視圖、控制器分開。使三者可以各負(fù)其責(zé),處理自己的邏輯。
2、Struts框架的介紹:
Struts框架也采用了MVC結(jié)構(gòu):
Model:在Struts框架中,Model模型的實(shí)現(xiàn)是JavaBean。在Struts框架中,通過使用JavaBean完成信息的存儲(chǔ)。
Control:控制器即Java Servlet,由框架提供,負(fù)責(zé)視圖和模型之間的交互??刂破鞯拿總€(gè)入口都由名為struts-config.xml的配置文件設(shè)置。該文件把來自視圖的請(qǐng)求映射為特定的Java類
以進(jìn)行相應(yīng)的處理,控制器還指定下一個(gè)視圖的位置。
View:視圖,當(dāng)然使用JSP了。
是不是很簡(jiǎn)單啊。
下面的序列圖反映了一個(gè)簡(jiǎn)單的Strut構(gòu)架的運(yùn)行過程:
(點(diǎn)擊看大圖)
看到上面的序列圖,如果讓我們從頭來寫代碼,來實(shí)現(xiàn)Struts構(gòu)架,這樣也太累了。Struts構(gòu)架給我們提供了不少類,如果ActionServlet、Action、ActionForm等。通過繼承使用他們和使用框架,我們只需寫幾個(gè)繼承類,就可以寫出基于這個(gè)框架的代碼了。這就是框架的好處,他把一些細(xì)節(jié)給我們屏蔽了,我們只要實(shí)現(xiàn)了關(guān)鍵部分。OK,就可以了。結(jié)構(gòu)又好,又方便。這就是框架的好處。
通過上面的說明,或許你對(duì)框架會(huì)有些了解??蚣?,簡(jiǎn)單的理解,就是我們小學(xué)時(shí)做的填空題,我們把重要的空填一下。就可以了。顯然,上面的描述不是很準(zhǔn)確,但用來簡(jiǎn)單的理解框架還是可以的。
下面需要用一個(gè)實(shí)例來說明如何使用struts框架了。
我們用Struts實(shí)現(xiàn)一個(gè)簡(jiǎn)單的注冊(cè)信息頁面。
需要注冊(cè)的信息只由用戶名和密碼。下面是具體的實(shí)現(xiàn)。
首先定義一個(gè)User類:
1: public class User {
2: private String userName;
3: private String password;
4:
5: public String getPassword() {
6: return password;
7: }
8:
9: public void setPassword(String password) {
10: this.password = password;
11: }
12:
13: public String getUserName() {
14: return userName;
15: }
16:
17: public void setUserName(String userName) {
18: this.userName = userName;
19: }
20:
21: }
User類定義了用戶的信息描述。下面的UserForm繼承了AcitonForm類,用于驗(yàn)證請(qǐng)求信息并對(duì)表單信息進(jìn)行檢查。
public class UserForm extends ActionForm {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getUserName() {
return user.getUserName();
}
public String getPassword() {
return user.getPassword();
}
@Override
public void reset(ActionMapping a, HttpServletRequest r) {
this.user = new User();
}
@Override
public ActionErrors validate(ActionMapping a, HttpServletRequest r) {
ActionErrors errors = new ActionErrors();
if(user.getUserName()==null||(user.getPassword()==null)){
errors.add("請(qǐng)?zhí)顚懹脩裘兔艽a!",new ActionMessage("error.user.password"));
}
return errors;
}
}
UserAction類:繼承了Action,用來相應(yīng)請(qǐng)求。看看execute函數(shù)就知道請(qǐng)求相關(guān)的參數(shù)包括映射(ActionMapping)、請(qǐng)求表單(ActionForm)、servlet請(qǐng)求(HttpServletRequest)和響應(yīng)(HttpServletResponse)。那么就很容易的寫出處理請(qǐng)求的函數(shù)。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
*
* @author WangJing
*/
public class UserAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm arg1, HttpServletRequest request, HttpServletResponse arg3) throws Exception {
UserForm userForm = new UserForm();
try{
UserBean bean = new UserBean();
bean.addUser(userForm.getUser());
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("user",userForm.getUser());
return (mapping.findForward("userCreated"));
}
}
UserBean:它實(shí)現(xiàn)了具體的業(yè)務(wù)邏輯,她被Action調(diào)用。完成數(shù)據(jù)的存儲(chǔ)。
class UserBean {
void addUser(User user) {
throw new UnsupportedOperationException("Not yet implemented");
}
private Connection conn;
public UserBean() {
this.conn = DatabaseConn.getConnection();
}
public void addUser(User user){
Statement s = (Statement) conn.createStatement();
s.executeUpdate("insert into User values("+user.getUserName()+","+user.getPassword()+");");
}
}
上面的代碼進(jìn)行了數(shù)據(jù)的存儲(chǔ)處理。需要注意的是代碼中的DatabaseConn.getConnection()是沒有的。需要自己實(shí)現(xiàn)的。具體的實(shí)現(xiàn)可以參考本人的博客中關(guān)于連接數(shù)據(jù)庫的一篇文章。
好了,下面就是最重要的顯示JSP文件代碼的編寫了:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-logic" prefix="logic" %>
<%@ taglib uri="/struts-bean" prefix="bean" %>
<%@ taglib uri="/struts-html" prefix="html" %>
<!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>JSP Page</title>
</head>
<body>
<html:form aciton="createUser.do" method="GET">
userName:<html:text property="user.userName"/>
password:<html:text property="user.password"/>
<html:submit property="submit"/>
</html:form>
</body>
</html>
下面用viewUser.jsp來作為響應(yīng)頁面:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
User user= (User)request.getAttribute("User");
%>
已經(jīng)創(chuàng)建了用戶:
name:<%=user.getUserName()%>
password:<%=user.getPassword()%>
</body>
</html>
ok,所有的文件編好之后,下面就是配置和運(yùn)行了。(累了,配置運(yùn)行休息一會(huì)在弄吧。待續(xù)中。。。呵呵。。。。)