一个好的Web应用:功能完善、易于实现和维护易于扩展等的体系结构
一个Web应用通常分为两个部分:
-
由界面设计人员完成的表示层(主要做网页界面设计)
-
由程序设计人员实现的行为层(主要完成本Web应用的各种功能)
Web开发的两种常用模式
Web开发的两
Model1 纯JSP或JSP+javabean
适用于小型的Web应用
模型1可以分为两种方式:
1. 完全使用JSP页面
优点**:简单,所见即所得,容易实现**
缺点**:访问数据库的代码需要写在JSP页面中,如果数据库发生变化****,**JSP页面需要重写
2.使用JSP+JavaBean
优点**:数据访问代码和JSP****页面分离,数据访问代码重用性好**
缺点**:****系统复杂时,**JSP页面中仍会包含大量脚本代码,代码开发和维护困难
Model2 MVC模式
该模型是一种将应用分解成三个独立部分的通用模型。
这三个部分分别是:
模型(Model) : 描述系统的数据
视图(view) : 数据的显示,包括图形、文本和文件输出等;
控制器(Controller) : 获取系统的输入,控制系统的执行;
MVC 是 Model-View-Controller 的缩写 :
Model代表的是应用程序的商业逻辑 (通过 JavaBean 、 EJB 等组件实现) ;
View提供可交互的客户界面 ,向客户显示模型数据(使用 JSP 来输出 HTML );
Controller响应客户的请求 ,根据客户的请求操纵模型,并把模型的响应结果由视图展现给客户 ( 通常是 Servlet ) ;
MVC好处
各司其职,互不干涉
在MVC 模式中,三个层各司其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。
有利于开发中的分工
在MVC 模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的 JSP ,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。
有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。
MVC 有助于把应用分离成合理的组件,以方便开发
MVC(Servlet、JSP、JavaBean相结合)
Servlet扮演控制者的角色,接受客户请求 ,创建 JavaBean , 由 JavaBean 执行业务逻辑 ,向 Servlet 返回结果。 Servlet 将结果交给 JSP 页面 ,由 JSP 页面生成 HTML 向客户返回结果 。
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对象,例如:
BeanClassbean=newBeanClass**();**
(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:useBeanid="keyWord" type="usern.yourbean.BeanClass" scope="session"/>** 标记获得servlet所创建的bean的引用,然后使用**<jsp:getPropertyname="keyWord" property="bean的变量"/>标记显示该bean中的数据,该标记中的id是servlet所创建的bean****索引关键字。**
对于生命周期为session的bean,如果servlet希望某个JSP显示其中的数据,可以使用RequestDispatcher对象向该JSP页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。
show.jsp页面使用如下标记获得servlet所创建的bean的引用(注意没有用type属性而是用class属性):<jsp:useBeanid="keyWord" class="user.yourbean.BeanClass" scope="session"/>该标记中的id是servlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面或其他页面事先已经有了id是"keyWord",scope是" session "的bean**,那么这个bean也会被servlet所创建的bean替换。**
原因是,servlet所请求的JSP页面或其他页面被刷新时,就会根据当前页面使用的**<jsp:useBeanid="keyWord" class="user.yourbean.BeanClass" scope=" session "/>标记到Tomcat引擎管理的内置对象PageContext中寻找id是"keyWord",生命周期是session,而该bean已经被servlet更新了。**
application周期的Javabean
1**.**Javabean的创建
servet创建生命周期为application的bean****的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClassbean=newBeanClass**();**
(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:useBeanid="keyWord" type="user.yourbean.BeanClass" scope="application"/>标记获得servlet所创建的bean的引用,然后使用<jsp:getPropertyname="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:useBeanid="keyWord" class="user.yourbean.BeanClass" scope="application"/>该标记中的id是servlet所创建的bean索引关键字。那么即使servlet所请求的JSP页面或其他事先已经有了id是"keyWord",scope是"application"的bean****,那么这个bean也会被servlet所创建的bean替换。**
原因是,servlet所请求的JSP页面或其他页面被刷新时,就会根据当前页面使用的:<jsp:useBeanid="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:\javacmybean****\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 数据库连接
避免操作数据库出现中文乱码,需要使用
ConnectiongetConnection(java.lang.String)方法建立连接,连接中的代码是(用户是root**,其密码是空)**
Stringurl= "jdbc:mysql://127.0.0.1/student?"+****"user=root&password=&characterEncoding=gb2312";
Connection con =DriverManager.getConnection(uri);