大家好呀:
大家觉得JSP技术相对于ASPX,PHP,甚至于ASP而言有什么样的区别吗?JSP相对于这些技术而言的优势是不言而喻的,为什么这么说呢?原因很简单,JSP是SUN公司专门为WEB应用领域开发的一整套的解决方案,而并非一种语言,人们常说这语言那语言,什么C,Pascal,Basic,c++,java,c#,而我告诉你JSP不是一门语言也不是技术而是一整套的WEB应用程序的解决方案,有朋友这时它会说JSP不就是
JavaServerPage他是使用JAVA确语言的的服务器端技术吗?其实不然,JSP最初虽然是这样定义,而且最初的JSP是只支持JAVA语言,不过这门技术到后来不光光只是支持JAVA,更可以支持其它的网络编程语言,其实说网络编程语言也不太准确,应该是技术吧,未来的JSP可以对C#也能提供支持,那就是JSP与ASPX没什么两样了.呵呵,开个玩笑!请大家记得JSP不只支持JAVA语言就可以了.
那为什么现在流行的网站呀或是论坛都没有采用JSP,而是采用的ASPX,PHP,甚至于ASP这么古老的技术呢?在上文已经说得很清楚了JSP是一整套的解决方案,所以他已经含盖了WEB应用程序开发的所有环节,不光只限于代码实施这一个一般计算机语言所能涉及到的范畴.它甚至于还包括了你的应用程序所使用的硬件,WEB服务器,操作系统唯一不包括的就是客户端即浏览器的内容!因为得益于JAVA跨平台的优势所以无论你使用哪种操作系统windows,Linux,unix,Mac Os,你都可以浏览到JSP的页面!JSP因为包含了太多的内容所以一般的JSP即使是最小的框架也非常的庞大相对于一般的ASP/PHP而言 ,而且他对硬件的要求也远远高于ASP.net,一般的JSP应用程序都是在IBM AIX5+Oracle 9i 这样的操作系统上运行的,一般的小公司哪里用得起这样的服务器呢?而相对于.net 的要求就比较扁平化既有高端也有低端在WIN2K设置个IIS5就可以运行,而且也偏重于windows平台,对于其它如Linux+apache+mysql这样的平台对ASP.net的支持还远不如Linux+tomcat5+mySql的到位.再就是由于JSP是开发大型的Web应用程序相对于一般的论坛用JSP来做开发简单来讲就是杀鸡焉用牛刀.做个论坛也用JSP太浪费了吧...呵呵
好了说了这么进正题,今天想给大家讲的是登录页面的制作,我想一般的Web应用程序都少不了登录这个环节吧,好我现在就以一个基于JSP的开源框架Struts为例,向大家讲解如何,使用struts这个通用的框架建立一个属于自己的Web应用平台...~!~
1.工具介绍: 1) .IDE环境:Myeclipse 4.0GA
2). JDK: 1.5.0
3).Web应用服务器:tomcat 5.0
4).数据库:MS SQLServer2K
5).操作系统:winxp sp2
2.正式开始:1)打开Myeclipse,新建一个Web工程.
2)左边工程管理器,添加Struts1.2架包
3)同上在工程管理器窗口内WebRoot这个文件夹下新建一个名为Login的JSP文件,并在Template右边框选struts1.2
4)下面是JSP的源码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
<head>
<html:base />
<title>bbsLogin.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<LINK rel="stylesheet" href="COMMON/style.css" type="text/css"/>
</head>
<body>
<html:form action="/Login.do">
<table width="778" height="640" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="689" align="center"><img src="IMAGES/backgroud.jpg" width="448" height="360"></td>
</tr>
<tr>
<td height="156" valign="top" bordercolor="B5D9FF"><table width="793" height="134" border="1" cellpadding="0" cellspacing="0" bordercolor="B5D9FF">
<tr>
<td height="98" valign="top"><table width="907" height="103" border="0" cellpadding="0" cellspacing="0" bordercolor="B5D9FF">
<tr>
<td width="147" height="23"> </td>
<td width="194"> </td>
<td width="261"> </td>
<td width="80" rowspan="3" align="center"><img src="IMAGES/guest.gif" width="64" height="64"></td>
<td width="80" rowspan="3" align="center"><img src="IMAGES/reg.gif" width="64" height="64"></td>
<td width="141" rowspan="3"> </td>
</tr>
<tr>
<td height="20" align="right">用户名:</td>
<td><html:text property="userName" size="20"/> </td>
<td> </td>
</tr>
<tr>
<td height="20" align="right">密 码:</td>
<td><html:password property="password" size="22"/></td>
<td><html:submit value="登入"/></td>
</tr>
<tr>
<td height="21" align="right"> </td>
<td> </td>
<td> </td>
<td align="center"> <a href = "/Login.do?userName=guest">游客进入</a></td>
<td align="center"><a href = "/ToRegist.do">注册新用户</a></td>
<td> </td>
</tr>
</table></td>
</tr>
<tr>
<td height="50" background="IMAGES/banner.jpg"> </td>
</tr>
</table></td>
</tr>
<tr>
<td align="center">Shine 阳 光 在 线 版 权 所 有</td>
</tr>
</table>
</table>
</html:form>
</body>
</html:html>
5)配置WEB_INF下的STRUTS-CONFIG.XML,下面是源码:
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources>
<data-source key="SQLserver2K" type="org.apache.commons.dbcp.BasicDataSource">
<set-property value="com.microsoft.jdbc.sqlserver.SQLServerDriver" property="driverClassName"/>
<set-property value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" property="url"/>
<set-property value="5" property="maxActive"/>
<set-property value="sa" property="username"/>
<set-property value="sa" property="password"/>
<set-property value="true" property="autoCommit"/>
</data-source>
</data-sources>
<form-beans>
<form-bean name="formBean_Login" type="org.shineBBS.actionform.Loginform"/>
</form-beans>
<global-exceptions />
<global-forwards>
<forward name="bbsLogin" path="/bbsLogin.jsp"></forward>
</global-forwards>
<action-mappings >
<action path="/Login" type="org.shineBBS.action.Login" name="formBean_Login" scope="request" input="bbsLogin.jsp"/>
</action-mappings>
<message-resources parameter="org.shineBBS.struts.ApplicationResources" />
</struts-config>
6)上面配置了一个ACTION和一个FORMBEAN,这两个其实都是两个类,不过是两个很特殊的类,都是由基类派生而来,所以继承了基类的方法, ACTION这个类主要是接受前台JSP页面上的请求,根据不同的请求把数据发送到不同的业务类里进行处理.比如前台是要做登录的请求,那么这个ACTION就会把数据转发给处理LOGIN的类进行处理.而如果还有其它请求,如注册,这时我们可以在上面的XML配置内的<forward-forwards>里加一个<action>一个用于处理注册的ACTION,而FORMBEAN是把前台的数据存储的一个类,理上前台JSP有一个<form>表单就有一个对应的formbean用来存储,而我们上文userLogin.jsp里面就有一个Form,当用户点击了里面的submit这时系统就会把form里的每个propecty的内容,填充至按照struts-config.XML里<action name="">指向的FORMBEAN.而这个FORMBEAN里面的内容又会被ACTION所转发至相应的处理类.
用户在form里的userName里写了用户名,又在password里写了密码,当他点提交时,这时系统会都先把FORMBEAN填充,然后调用相应的action,因为这时你在form里的action=""这里设置action的路径,也就是<action path=""这个的名字一样,然后系统会根据他后面的type属性找到ACTION类的位置,也同时根据name找到formbean,而formbean中的type也可找到formbean类所在的路径,然后如上文填充这个类,当然也可以在这个formbean里作一些简单的验证:下面是formBean的代码
import org.apache.struts.action.ActionForm;
public class Loginform extends ActionForm {
private String userName;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
7) 然后再就是action 类的内容,这里是一个转发的类所以只是通过request这方法接受formbean的值,然后把formbean转入处理的类里.所以有一个处理的类.user这个类还可以包含用户所用的行为,验证只是其中之一,及还有一个与数据库连接的类,代码如下
//action
package org.shineBBS.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.shineBBS.actionform.Loginform;
import org.shineBBS.model.DB;
import org.shineBBS.model.User;
public class Login extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
ServletContext context = servlet.getServletContext();
DataSource datasource = (DataSource)context.getAttribute("SQLserver2K");
//从上下文取得数据源
Loginform lform = (Loginform)form;//接受传进来的formbean并将其转换成相应的类型
DB db = new DB(datasource);//实例一个与数据库连接的类,并用数据源datasource构造它
User user = new User();
String goStr = ""; //转发的字符串
if(1==user.VerifyUser(lform,db)){
goStr= "bbsMain"; //调用校验数据的方法对用户信息进行验证,如为1说明验证通过,否则失败
}
else{
goStr="bbsLogin"; //失败则反回登录页面的字符串
}
return mapping.findForward(goStr);//传入字符串,转至struts-config里mapping所配置的页面
}
}
//数据连接类
package org.shineBBS.model;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import javax.sql.DataSource;
public class DB {
private Connection connect = null;
private ResultSet rs = null;
public DB(DataSource datasource) {
try {
connect = datasource.getConnection();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public ResultSet OpenSql(String sql){
try {
Statement stmt = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return rs;
}
public ArrayList execProc(ArrayList list,String sql) throws SQLException{
ArrayList list_out = new ArrayList();
CallableStatement cs = connect.prepareCall(sql);
Iterator it = list.iterator();
int i = 1;
while(it.hasNext()){
cs.setString(i,(String)it.next());
i++;
if(i == (list.size()-1)){
break;
}
}
cs.registerOutParameter(i,Types.INTEGER);
cs.executeUpdate();
list_out.add(String.valueOf(cs.getInt(i)));
return list_out;
}
public void close() {
try {
connect.close();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
connect = null;
}
}
//用户类
package org.shineBBS.model;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import org.shineBBS.actionform.Loginform;
import com.sun.org.apache.bcel.internal.generic.RETURN;
public class User {
private String userName = null;
private String password = null;
private String nickName = null;
private String birthyear = null;
private String birthmonth = null;
private String birthday = null;
private String eMail = null;
private String sign = null;
private String userGrade = null;
private int userScore = 0;
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getBirthmonth() {
return birthmonth;
}
public void setBirthmonth(String birthmonth) {
this.birthmonth = birthmonth;
}
public String getBirthyear() {
return birthyear;
}
public void setBirthyear(String birthyear) {
this.birthyear = birthyear;
}
public String getEMail() {
return eMail;
}
public void setEMail(String mail) {
eMail = mail;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getUserGrade() {
return userGrade;
}
public void setUserGrade(String userGrade) {
this.userGrade = userGrade;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserScore() {
return userScore;
}
public void setUserScore(int userScore) {
this.userScore = userScore;
}
public int VerifyUser(Loginform loginform,DB db) throws SQLException{
ArrayList list_in = new ArrayList();
int status = 0;
list_in.add(loginform.getUserName());
list_in.add(loginform.getPassword());
list_in.add(Integer.valueOf(status));
ArrayList listout = db.execProc(list_in,"{call VerifyUser(?,?,?)}");
Iterator it = listout.iterator();
Integer status_out = null;
while(it.hasNext()){
status_out = (Integer)it.next();
}
return status_out.intValue();
}
}
好了...好长一篇,呵呵,这样用户登录的页面就做好了.怎么,是不是觉得很长呀,其实这是标准版的,因为你在这上面可以加东西,都不会有任何影响的.像用户的一些如注册呀修改呀之类方法,因为用户这个类都有了只用在里面加上相应的方法就可以了...
今天就写到这里吧,下次吧...不知觉间写了一下午...呵呵...好累呀 Be continue