Web应用
一个好的Web应用:
功能完善
易于实现和维护
易于扩展等
的体系结构
一个Web应用通常分为两个部分:
(主要做网页界面设计)
(主要完成本Web应用的各种功能)
Web开发的两种常用模式
Web开发的两种常用模式
Model1 纯JSP或JSP+javabean
适用于小型的Web应用
优点:简单,所见即所得,容易实现
缺点:访问数据库的代码需要写在JSP页面中,如果数据库发生变化,JSP页面需要重写
2.使用JSP+JavaBean
优点:数据访问代码和JSP页面分离,数据访问代码重用性好
缺点:系统复杂时,JSP页面中仍会包含大量脚本代码,代码开发和维护困难
Model2 MVC模式
模型2其实就是一种MVC体系结构,也称为MVC模型2。该模型是一种将应用分解成三个独立部分的通用模型。
MVC好处
MVC模式来实现用户注册
1.模型(JavaBean) -
useBe.Register.class
package useBe;
public class Register
{ String logname="",password="",email="";
String backNews;
public void setLogname(String name)
{ logname=name;
}
public String getLogname()
{ return logname;
}
public void setPassword(String pw)
{ password=pw;
}
public String getPassword()
{ return password;
}
public void setEmail(String em)
{ email=em;
}
public String getEmail()
{ return email;
}
public String getBackNews()
{ return backNews;
}
public void setBackNews(String s)
{ backNews=s;
}
}
2.控制器(servlet) -
useSe.HandleRegister.class
package useSe;
import useBe.Register;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HandleRegister extends HttpServlet
{ public void init(ServletConfig config) throws ServletException
{ super.init(config);
try { Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){}
}
public String handleString(String s)
{ try{ byte bb[]=s.getBytes("iso-8859-1");
s=new String(bb);
}
catch(Exception ee){}
return s;
}
void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{ Connection con;
Statement sql;
Register reg=new Register(); //创建Javabean对象
request.setAttribute("register",reg);//将dataBean存储到request对象中
String logname=request.getParameter("logname").trim(),
password=request.getParameter("password").trim(),
email=request.getParameter("email").trim();
String uri="jdbc:mysql://127.0.0.1:3306/test1";
if(logname==null)
logname="";
if(password==null)
password="";
boolean isLD=true;
for(int i=0;i<logname.length();i++)
{ char c=logname.charAt(i);
if(!((c<='z'&&c>='a')||(c<='Z'&&c>='A')||(c<='9'&&c>='0')))
isLD=false;
}
boolean boo=logname.length()>0&&password.length()>0&&isLD;
String backNews="";
try{ con=DriverManager.getConnection(uri,"root","123456");
String insertCondition="INSERT INTO member VALUES ('"+logname+"','"+password+"','"+email+"')";
sql=con.createStatement();
if(boo)
{ int m=sql.executeUpdate(insertCondition);
if(m!=0)
{ backNews="注册成功";
reg.setBackNews(backNews);
reg.setLogname(logname);
reg.setPassword(handleString(password));
reg.setEmail(handleString(email));
}
}
else
{ backNews="信息填写不完整或名字中有非法字符";
reg.setBackNews(backNews);
}
con.close();
}
catch(SQLException exp)
{ backNews="该会员名已被使用,请您更换名字"+exp;
reg.setBackNews(backNews);
}
RequestDispatcher dispatcher=request.getRequestDispatcher("show.jsp");//请求show.jsp显示信息
dispatcher.forward(request, response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{ doPost(request,response);
}
}
MVC模式来实现用户注册
3.视图(jsp)
register.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<head>
<table>
<td><A href="register.jsp"><font size=5>用户注册</font></A></td>
</table>
</head>
<HTML><BODY bgcolor=cyan><Font size=5><CENTER>
<FORM action="helpRegister" name=form>
<table>
输入您的信息,用户名称必须由字母和数字组成,带*号项必须填写。
<tr><td>用户名称:</td><td><Input type=text name="logname" >*</td></tr>
<tr><td>设置密码:</td><td><Input type=password name="password">*</td></tr>
<tr><td>电子邮件:</td><td><Input type=text name="email"></td></tr>
<tr><td><Input type=submit name="g" value="提交"></td></tr>
</table>
</Form></CENTER>
</Body></HTML>
show.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="useBe.Register"%>
<jsp:useBean id="register" type="useBe.Register" scope="request"/>
<head>
<table>
<td><A href="register.jsp"><font size=5>用户注册</font></A></td>
</table>
</head>
<HTML><BODY bgcolor=yellow>
<CENTER>
<Font size=5 color=blue >
<BR><jsp:getProperty name="register" property="backNews"/>
</Font>
<table>
<tr><td>注册的名称:</td>
<td><jsp:getProperty name="register" property="logname"/></td>
</tr>
<tr><td>注册的电子邮件:</td>
<td><jsp:getProperty name="register" property="email"/></td>
</tr>
</table>
</CENTER></BODY></HTML>
MVC模式的核心思想是有效地组合“视图”、“模型”和“控制器”。
本章将介绍MVC模式,掌握该模式对于设计合理的Web应用以及学习使用某些流行的Web框架,如Hibernate,Spring,Struts等,都有着十分重要的意义。
MVC是一种通过三个不同部分构造一个软件或组件的理想办法:
模型(Model)——用于存储数据的对象。
视图(View)——为模型提供数据显示的对象。
控制器(Controller)——负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出处理,并将有关结果存储到模型中,同时负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。
在JSP技术中,“视图”、“模型”和“控制器”的具体实现如下:
模型(Model):
一个或多个JavaBean对象,用于存储数据,JavaBean主要提供简单的setXXX()方法和getXXX()方法,在这些方法中不涉及对数据的具体处理细节。
视图(View):
一个或多个JSP页面,为模型提供数据显示,JSP页面主要使用 HTML标记和JavaBean标记来显示数据。
控制器(Controller):
一个或多个Servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到JavaBean中,然后Servlet使用重定向方式请求视图中的某个JSP页面更新显示。
在JSP+Javabean模式中,由JSP页面通过使用useBean标记:
<jsp:useBean id="名字" class="创建bean的类" scope="生命周期"/>创建Javabean。
JSP中的MVC模式中,也可以由控制器servet创建Javabean,并将有关数据存储到所创建的Javabean中,然后servlet请求某个JSP页面使用Javabean的getProperty动作标记:
<jsp:getProperty name= "名字" property="bean的属性"/>
显示Javabean的中的数据。
在JSP中的MVC模式中,非常重要的手段是由servlet负责用构造方法创建Javabean,因此允许创建Javabean的类可以有带参数的构造方法。
在JSP中的MVC模式中,servet创建的Javabean也涉及到生命周期(有效期限),生命周期分为request、session和application。以下假设创建Javabean的类的名字是BeanClass,该类的包名为user.yourbean 。
request周期的Javabean
1.Javabean的创建
servlet负责创建bean。那么创建生命周期为request的bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到HttpSerletRequest对象request中,并指定查找该bean的关键字,该步骤决定了bean的生命周期为request。例如:
request.setAttribute("keyWord",bean);
执行上述操作,就会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id是"keyWord",生命周期是
PageContext.REQUEST_SCOPE(request)。
2 视图更新
servlet请求一个JSP页面,比如show.jsp的代码如下:
RequestDispatcher dispatcher= request.getRequestDispatcher("show.jsp");
dispatcher.forward(request,response);
servlet所请求的JSP页面可以使用如下标记获得servlet所创建的bean的引用(type属性使得该JSP页面不负责创建bean):
<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope="request"/>
该标记中的id是servlet所创建的bean索引关键字。然后JSP页面使用<jsp:getProperty name="keyWord" property="bean的变量"/>标记显示bean中的数据。如果上述代码执行成功,用户就看到了show.jsp页面的执行效果。
特别注意: 如果servlet所请求的JSP页面,使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性):
<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="request"/>
该标记中的id是servlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面事先已经有了id是"keyWord",scope是"request"的bean,那么这个bean也会被servlet所创建的bean替换。
原因是servlet所请求的JSP页面会被刷新,就会根据当前页面使用的<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="request"/> 标记到Tomcat引擎管理的内置对象PageContext中寻找id是"keyWord",生命周期是request,而该bean已经被servlet更新了。
session周期的Javabean
1.Javabean的创建
servet创建生命周期为session的bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)将所创建的bean对象存放到HttpSerletSession对象:session中,并指定查找该bean的关键字,该步骤决定了bean的生命周期为session。例如:
HttpSession session=request.getSession(true);
session.setAttribute("keyWord",bean);
内置对象执行上述操作,就会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id是"keyWord",生命周期是PageContext.SESSION_SCOPE(session)。
2 视图更新
servelt创建bean, bean的生命周期为session,只要用户的session没有消失,该bean就一直存在,一个用户在访问Web服务目录的各个JSP中都可以使用<jsp:useBean id="keyWord" type="usern.yourbean.BeanClass" scope="session"/> 标记获得servlet所创建的bean的引用,然后使用<jsp:getProperty name="keyWord" property="bean的变量"/>标记显示该bean中的数据,该标记中的id是servlet所创建的bean索引关键字。
对于生命周期为session的bean,如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。
show.jsp页面使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性):<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="session"/>该标记中的id是servlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面或其他页面事先已经有了id是"keyWord",scope是" session "的bean,那么这个bean也会被servlet所创建的bean替换。
原因是,servlet所请求的JSP页面或其他页面被刷新时,就会根据当前页面使用的<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope=" session "/>标记到Tomcat引擎管理的内置对象PageContext中寻找id是"keyWord",生命周期是session,而该bean已经被servlet更新了。
application周期的Javabean
1.Javabean的创建
servet创建生命周期为application的bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean=new BeanClass();
(2)servlet使用getServletContext()方法返回服务器的ServletContext内置对象的引用,将所创建的bean对象存放到服务器这个ServletContext内置对象中,并指定查找该bean的关键字,该步骤决定了bean的生命周期为application,例如:
getServletContext().setAttribute("keyWord",bean);
上述操作,就会把bean存放到Tomcat引擎管理的内置对象pageContext中,该bean被指定的id是"keyWord",有效期限是(生命周期)PageContext.APPLICATION_SCOPE(application)。
2 视图更新
当servlet创建创建生命周期为application的bean后,只要Web应用程序不结束,该bean就一直存在。一个用户在访问Web服务目录的各个JSP中都可以使用<jsp:useBean id="keyWord" type="user.yourbean.BeanClass" scope="application"/> 标记获得servlet所创建的bean的引用,然后使用
<jsp:getProperty name="keyWord" property="bean的变量"/>标记显示该Javabean中的数据,该标记中的id是servlet所创建的bean索引关键字。
对于生命周期为application的bean,如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。
注意:所有用户在同一个Web服务目录中的application生命周期的bean是相同的,即占有相同的内存空间。另外,如果servlet所请求的JSP页面,比如show.jsp页面,使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性):<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="application"/>该标记中的id是servlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面或其他事先已经有了id是"keyWord",scope是"application"的bean,那么这个bean也会被servlet所创建的bean替换。
原因是,servlet所请求的JSP页面或其他页面被刷新时,就会根据当前页面使用的:<jsp:useBean id="keyWord" class="user.yourbean.BeanClass" scope="application"/>标记到Tomcat引擎管理的内置对象PageContext中寻找id是"keyWord",生命周期是application,而该bean已经被servlet更新了。
Javabean和Servlet与配置文件
Javabean类的包名均为mybean.data;Servlet类的包名均为myservlet.control。
1.保存Javabean类和Servlet类的源文件
D:\ mybean\data 和 D:\myservlet\control
2.编译Javabean类
D:\javac mybean\data\Javabean的源文件
3.编译Servlet类
D:\ javac myservlet\control\servlet的源文件
4.将类的字节码文件保存到服务器
ch9\WEB-INF\classes\mybean\data
和ch9\WEB-INF\classes\myservlet\control
5.web.xml文件
编写web.xml文件,并保存到Web服务目录的WEB-INF子目录中,即ch9\WEB-INF中 。
MVC模式与注册登录 大部分Web应用都会涉及到注册与登录模块。本节使用MVC模式讲述怎样设计注册、登录模块。为ch9\WEB-INF中的web.xml文件添加如下子标记
Javabean与Servlet管理
本节的Javabean类的包名均为mybean.data;Servlet类的包名均为myservlet.control。
1.保存Javabean类和Servlet类的源文件
D:\ mybean\data 和 D:\myservlet\control
2.编译Javabean类
D:> javac mybean\data\Javabean的源文件
3.编译Servlet类
D:> javac myservlet\control\servlet的源文件
4.将类的字节码文件保存到服务器
ch9\WEB-INF\classes\mybean\data 和
ch9\WEB-INF\classes\myservlet\control
配置文件管理
本节的Servlet类的包名均为myservlet.control,需要配置Web服务目录的web.xml文件,即将下面的web.xml文件保存到Tomcat安装目录的Web服务目录ch9中。根据本书使用的Tomcat安装目录及Web服务目录,需要将web.xml文件保存到
D:\apache-tomcat-8.0.3\webapps\ch9\WEB-INF
目录中。
web.xml
<servlet>
<servlet-name>register</servlet-name>
<servlet-class>myservlet.control.HandleRegister</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/helpRegister</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>myservlet.control.HandleLogin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/helpLogin</url-pattern>
</servlet-mapping>
数据库设计与连接
1 创建一个数据库 、表
使用MySQL建立一个数据库student,该库共有一个user表 。
user表的用途:存储用户的注册信息。即会员的注册信息存入user表中,user表的主键是logname,各个字段值的说明如下:
logname :存储注册的用户名(属性是字符型,主键)。
password :存储密码(属性是字符型)。
email :存储email(属性是字符型)。
2 数据库连接
避免操作数据库出现中文乱码,需要使用
Connection getConnection(java.lang.String) 方法建立连接,连接中的代码是(用户是root,其密码是空):
String url = "jdbc:mysql://127.0.0.1/student?"+
"user=root&password=&characterEncoding=gb2312";
Connection con = DriverManager.getConnection(uri);