目录
2、使用RequestDispatcher对象调用forward0方法实现转发
例题: 使用JSP、Servlet、JavaBean 实现 MVC
1、什么是Servlet?
Servlet是用Java语言编写的服务器端小程序,驻留在web服务器中,并在其中运行,可以生成动态的 Web 页面。
JSP页面在执行时都要编译成Servlet。
JSP和Servlet两者可以实现同样的页面效果,不过,编写 JSP 和编写 Servlet 相比,JSP成本低得多。
编写一个Servlet类,只要继承javax.servlet.http包中的HttpServlet类,并重写响应HTTP请求的方法即可。HttpServlet类实现了Servlet接口,实现了响应用户请求的接口方法。HttpServlet类的一个子类习惯的称为一个Servlet类,这样的子类创建的对象有称为Servlet对象。
编写第一个Servlet类
package servlet;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class firstServlet extends HttpServlet {
private static final long serialVersionUTD = 1L;
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//设置响应的内容类型
resp.setContentType("text/html;charset=utf-8");
//获取输出的对象
PrintWriter out = resp.getWriter();
out.println("<html><body>");
//在浏览器中显示“第一个Servlet类”
out.println("第一个Servlet类");
out.println("</body></html>");
}
}
在web.xml中部署Servlet:
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>servlet.firstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
运行!
编写Servlet时必须有包名。新建一个包,所有的Servlet类放在包中(src目录下的servlet包中)。
编写完Servlet累的源文件,并编译了源文件,需要部署Servlet才可以运行Servlet对象。
部署方法有两种:
1、在web.xml中部署Servlet;
2、基于注解的方式部署Servlet
2、Servlet开发步骤
1、创建Servlet文件(new/Create New Servlet);
默认继承 javax.servlet.http.HttpServlet;
2、编写处理请求的方法
重写 HttpServlet 的 doGet()、doPost()方法;
或重写doService()方法
3、配置Servlet
在web.xml中配置Servlet 或 采用注解方式配置Servlet
3、Servlet的配置
从Servlet 3 开始,配置Servlet有两种方式
1、在Servlet类中使用@WebServlet注解进行配置
2、在web.xml中配置Servlet
注解配置示例
注解虽然方便了开发人员,但在后期会让维护和调试成本增加。为了方便后期维护,建议开发人员部署Servlet时把@WebServlet的属性urlPatterns 的值设置为Servlet类的名字。
@WebServlet(name ="secondServlet",urlPatterns ={ "/secondServlet"})
public class SecondServlet extends HttpServlet {
}
3.1、注解配置--@WebServlet支持的常用属性
@WebServlet用于将一个类声明为Servlet对象,该注解将会在部署时被Web容器处理Web 容器根据具体属性将相应的类部署为 Servlet 对象。该注解具有一些常用属性,
表中的所有属性均为可选属性,但是value 或者urlPatterns通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值。可使用简化注解,如@WebServlet("/secondServlet"),其中“/secondServlet”为请求的URL,即urlPatterns 属性值。
使用了@WebServlet注解部署后就不需要再使用web.xml部署了
注意:部署描述文件web.xml 的顶层标签 <web-app> 有一个 metadata-complete 属性,用于指定当前的部署描述文件是否是完全的。
如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解。
3.2web.xml中配置Servlet
配置Servlet的名字:对应web.xml的<servlet/>元素。
配置Servlet的URL:对应web.xml的<servlet-mapping/>元素。
格式如下:
<servlet>
<servlet-name>servlet名称</servlet-name>
<servlet-class>servlet包名.类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet名称</servlet-name>
<url-pattern>url映射名(访问路径)</url-pattern>
</servlet-mapping>
<servlet-name>:标记Web服务器创建Servlet对象的名字。web.xml可以有若干个<servlet>标记,但要求他们的<servlet-name>子标记的内容互不相同。
<servlet-class>:指定Web服务器用哪个类来创建Servlet对象;如果Servlet对象已经创建,那么Web服务器就不在使用指定的类创建。
<servlet-mapping>:和<servlet>标记成对出现。
<servlet-name>:标记Web服务器创建Servlet对象的名字。(改名字必须和<servlet>标记的子标记<servlet-name>的内容相同)
<url-patten>:指定用户用怎么样的方式请求Servlet对象。,例如,<url-pattern>子标记的内容是“/firstServlet”,用户需要请求服务器运行Servlet对象 firstServlet为其服务,那么可在浏览器的地址栏中输入“http://localhost:8080/ch6/firstServlet”。
示例:
<!--配置Servlet的名字-->
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>servlet.WelcomeServlet</servlet-class>
</servlet>
< !--配置Servlet的URL-->
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/welcomeServlet</url-pattern>
</servlet-mapping>
4、 Servlet的生命周期
Servlet实际上是一个Java类,可以创建其实例,这些对象也有自己的生命周期。
包括以下4个阶段:
- 加载和实例化(一次,普通Servlet是用户第一次请求的时候实例化,但是load-on-startup是应用启动的时候实例化)当Servlet对象第一次被请求加载时,服务器会创建一个Servlet对象。
- 初始化:Servlet对象调用init()方法(一次,实例化之后执行)
- 请求处理:调用service()方法(每次请求执行一次)
- 服务终止:调用destroy()方法(一次,通常在关闭Web容器或将项目移除容器之时销毁Servlet)
4.1加载和实例化
Servlet实例的创建和销毁等都不是由程序员决定的,而是由Web容器进行控制的。
创建Servlet实例的时机有两个:
- 客户端请求对应的Servlet时,创建Servlet实例:大部份的Servlet都是这种Servlet。
- Web应用启动时,立即创建Servlet实例:即load-on-startup Servlet。
注意:应用启动时就启动的Servlet,通常是用于某些后台服务的Servlet,或者拦截很多请求的Servlet。
Servlet容器负责加载和实例化,是否在容器启动时自动加载Servlet,这由在web.xml中设置的<load-on-startup>属性决定或@WebServlet中loadOnStartup决定
4.2初始化
调用init()方法在处理用户请求前完成初始化工作。若初始化失败,将抛出ServletException或UnavailableException异常,实例销毁。
4.3请求处理
- Servlet实例化后接收客户端请求、作出响应,都是通过调用service()方法来实现的。
- 由于Servlet采用多线程机制来提供服务,因此,该方法被同时、多次地调用,要注意线程安全。
- 用户在实现具体的Servlet时,web容器会根据请求方式的不同自动调用doGet()、doPost()方法,因此,只要重载对应的doXxx()即可,一般不重载service()方法。
4.4服务终止
服务器通过调用destroy方法释放Servlet运行时所占用的资源,该方法不用抛出异常。
public void destroy( ) {
//释放在init()中获得的资源,如关闭数据库的连接
super.destroy( );
}
注意:不要将Servlet的销毁机制作为向磁盘上保存诸如访问计数或Cookie列表等状态的唯一机制。因为web容器有可能崩溃,destroy()方法不一定总被执行。
通过JSP页面访问Servlet
可以通过JSP页面的表单或者超链接请求某个Servlet。通过JSP页面访问Servlet的好处是:JSP页面负责的静态信息处理,而动态信息处理由Servlet完成。
通过表单访问Servlet
<form action="firstServlet" method="post">
...
</form>
该表单的处理程序 (action)就是一个 Servlet,为该 Servlet 部署时,@WebServlet
的urlPattemms属性值为“/firstServlet"
通过超链接访问Servlet
在JSP页面中,可以单击超链接访问 Servlet 对象,也可以通过超链接向 Servlet 提交信息,例如,
<ahref="loginServlet?user-taipingle&&pwd=zhenzuile">查看用户名和密码</a>“查看用户名和密码”这个超链接就将 user-taipingle和pwd=zhenzuile两个信息提交给Servlet 处理。
doGet()和doPost()方法
- 当服务器接收到一个 Servlet 请求时,就会产生一个新线程,在这个线程中Servlet 对象调用 service()方法为请求做出响应。service()方法首先检查 HTTP 请求类型(get 或post),然后在 service()方法中根据用户的请求方式,对应地调用 doGet()或doPost()方法。
- HTTP请求类型为 get 方式时,service()方法调用doGet()方法响应用户请求;
- HTTP请求类型为 post 方式时,service()方法调用doPost()方法响应用户请求。因此,在 Servlet 类中,没有必要重写 service0方法,直接继承即可。
- 在Servlet类中重写doGet()或doPost()方法来响应用户的请求,这样可以增加响应的灵活性,同时减轻服务器的负担。
- 一般情况下,如果不论用户请求类型是 get 还是 post,服务器的处理过程完全相同,那么可以只在doPost()方法中编写处理过程,而在doGet()方法中再调用 doPost()方法:或只在doGet()方法中编写处理过程,而在 doPost()方法中再调用 doGet()方法。
例题:
inputLader.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>inputLader.jsp</title>
</head>
<body>
<h2>输入矩形的长和宽,提交给servlet(post方式)求面积:</h2>
<form action="GetLengthOrAreaServlet" method="post">
长:<input type="text" name="length"/><br>
宽:<input type="text" name="width"/><br>
<input type="submit" value="提交">
</form>
<br>
<h2>输入矩形的长和宽,提交给servlet(get方式)求周长:</h2>
<form action="GetLengthOrAreaServlet" method="get">
长:<input type="text" name="length"/><br>
宽:<input type="text" name="width"/><br>
<input type="submit" value="提交">
</form>
</body>
</html>
GetLengthOrAreaServlet页面:
package servlet;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "GetLengthOrAreaServlet", value = "/GetLengthOrAreaServlet")
public class GetLengthOrAreaServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String l = request.getParameter("length");
String w= request.getParameter("width");
out.println("<html><body>");
double m =0,n=0;
try{
m=Double.parseDouble(l);
n=Double.parseDouble(w);
out.println("矩形的周长是:"+(m+n)*2);
}catch (NumberFormatException e){
out.println("请输入字符!");
}
out.println("</body></html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String l = request.getParameter("length");
String w= request.getParameter("width");
out.println("<html><body>");
double m =0,n=0;
try{
m=Double.parseDouble(l);
n=Double.parseDouble(w);
out.println("矩形的面积是:"+m*n);
}catch (NumberFormatException e){
out.println("请输入字符!");
}
out.println("</body></html>");
}
}
结果:
5、在Servlet中获得JSP内置对象
1、JSP的内置对象在Servlet中不能直接使用,需自己创建;
2、获得JSP的内置对象方法:
获得 request 和 response 对象:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将 request 参数当成 request 对象使用
//将 response 参数当成 response 对象使用
}
获得out对象:
对应于javax.servlet.jsp.JspWriter类
PrintWriter out = response.getWriter();
中文乱码问题的解决:
把下列语句放在out输出语句之前
response.setContentType(“text/html;charset=utf-8”);
或 response.setChararcterEncoding(“utf-8”);
获得 session 对象:
对应于javax.servlet.http.HttpSession类
HttpSession session = request.getSession();
获得 application对象:
对应于javax.servlet. ServletContext类
ServletContext application = this.getServletContext();
6、 Servlet跳转
JSP的跳转方法:
response.sendRedirect( 目标路径 )
<jsp:forward page=“目标路径” />
在Servlet 中也有类似功能的语句。
重定向
response.sendRedirect(“URL地址”)
服务器内跳转(请求转发方式跳转)
1、获得RequestDispatcher对象
当前 JSP页面或 Servlet 中,使用 request 对象调用
public RequestDispatchergetRequestDispatcher(String url)方法返回一个RequestDispatcher 对象,其中参数url就是要转发的JSP页面或Servlet的地址。例如:
RequestDispatcher dis=request.getRequestDispatcher("dologin");
2、使用RequestDispatcher对象调用forward0方法实现转发
获得RequestDispatcher 对象之后,就可以使用该对象调用public voidforward(ServletRequest request,ServletResponse response)方法将用户对当前JSP页面或Servlet的请求转发给 RequestDispatcher 对象所指定的JSP页面或Servlet。例如:
dis.forward(request,response)
总结如下:
//ServletContext application=this.getServletContext();
RequestDispatcher rd=application.getRequestDispatcher(“URL地址”);
rd.forward(request,response);
转发是服务器行为,重定向是客户端行为。具体工作流程如下:
- 转发过程:客户浏览器发送 http 请求,Web 服务器接收此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户,在这里,转发的路径必须是同一个 Web 容器下的URL,不能转向到其他的 Web 路径上去,中间传递的是自己的容器内的 request。在客户浏览器的地址栏中显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
- 重定向过程:客户浏览器发送http 请求,Web 服务器接收后发送302状态码响应及对应新的 location 给客户浏览器,客户浏览器发现是 302 响应,则自动再发送一个新的 http请求,请求URL是新的location 地址,服务器根据此请求寻找资源并发送给客户。在这里,location 可以重定向到任意URL,既然是浏览器重新发出了请求,就没有什么request 传递的概念了。在客户浏览器的地址栏中显示的是其重定向的路径,客户可以观察到地址的变化。重定向行为是浏览器做了至少两次的访问请求。
注意:两种方式URL地址写法不一样。
重定向,如果写绝对路径,必须将虚拟目录根目录写在里面,如“/Prj05/page.jsp”;
请求转发,不需将虚拟目录根目录写在里面,如“/page.jsp”。
7、在Java Servlet中使用session
在Servlet中获得当前请求的会话对象可通过调用 HttpServletRequest的getSession0方法实现,例如:
HttpSession session = request.getSession(true);//若存在会话则返回该会话,否则新建一个会话
或者
HttpSession session = request,getSession(false);//若存在会话则返回该会话,否则返回null
通常情况下,通过第一种方式获得session,即指定getSession()的参数为true。默认参数为 true,即request.getSession(true)等同于request.getSession()。
例子:
编写JSP页面useSession.jsp,在该页面中通过表单向名为useSession的Servlet对象(由UseSessionServlet类负责创建)提交用户名,useSession将用户名存入用户的session对象中,然后用户请求另一个Servlet 对象showName(由ShowNameServlet 类负责创建),showName从用户的session 对象中取出存储的用户名,并显示在浏览器中。程序运行效果如图所示。
useSession.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="sendMyName" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="user"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
UseSessionServlet
package servlet;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "UseSessionServlet", value = "/sendMyName")
public class UseSessionServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
request.setCharacterEncoding("utf-8");
String name=request.getParameter("user");
if(name==null||name.trim().length()==0){
response.sendRedirect("userSession.jsp");
}else{
HttpSession session=request.getSession();
session.setAttribute("myName",name);
out.println("<html><body>");
out.println("您请求的servlet对象是:"+getServletName());
out.println("<br>您的会话ID是"+session.getId());
out.println("<a href='showMyName'>请求另一个servlet</a>");
out.println("</body></html>");
}
}
}
ShowNameServlet
package servlet;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "ShowNameServlet", value = "/showMyName")
public class ShowNameServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
HttpSession session=request.getSession(true);
String name=(String) session.getAttribute("myname");
out.println("<html><body>");
out.println("您请求的servlet对象是:"+getServletName());
out.println("<br>您的会话ID是"+session.getId());
out.println("<br>您会话中存储的用户名是:"+name);
out.println("</body></html>");
}
}
8、在Servlet 中读取参数
为什么要在配置文件(如web.xml)设置参数?
- 若参数写定在程序中,这称为“硬编码”。用这种方法修改参数,需要修改源程序,重新编译。
- 在web.xml设置参数,web容器可以自动读取,成本较低。
参数的种类及设定
参数种类:有2种
全局参数:所有Servlet都可以访问(ServletContext对象)
局部参数:只有相应的Servlet才能访问(ServletConfig对象)
在Web.xml中配置全局参数(独立于Servlet):
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
全局参数的获取方法:
ServletContext application = this.getServletContext();
application.getInitParameter("参数名称");
在Web.xml中配置局部参数:
<servlet>
<servlet-name>Servlet 名称</servlet-name>
<servlet-class>Servlet 类路径</servlet-class>
<init-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</init-param>
</servlet>
局部参数的获取方法:
this.getInitParameter("参数名称");
说明:此处的 this 是指 Servlet 本身
使用注解在Servlet中配置局部参数:
@WebServlet(
initParams={
@WebInitParam(name="url", value="jdbc:mysql://localhost:3306/javaee"),
@WebInitParam(name="user", value="sise"),
@WebInitParam(name="pass", value="123456")
}
)
9、设置欢迎页面
为什么要设置欢迎页面?
在很多的门户网站中,都会把自己的首页作为网站的欢迎页面。设置完欢迎页面后,用户登录时输入的 URL 只需为该门户网站的虚拟路径时,就可以自动访问欢迎页面,不必输入访问的文件名。
例如:http://www.sina.com.cn
这样做的好处是:用户不必知道首页的文件名,服务器端可以根据需要,在不同时间设置多个首页文件。
9.1设置欢迎页面的方法
<welcome-file-list>
<!-- 所要设定的欢迎页面 -->
<welcome-file>welcome.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
规则:web.xml 可以同时设置多个欢迎页面,Web 容器会默认设置的第一个页面为欢迎页面,如果找不到最前面的页面,Web 容器将会依次选择后面的页面为欢迎页面。
10、基于Servlet的MVC模式
10.1MVC模式
(1)MVC的概念
MVC是Model、View、Controller 的缩写,分别代表 Web 应用程序中的3种职责。
1、模型:用于存储数据以及处理用户请求的业务逻辑。
2、视图:向控制器提交数据,显示模型中的数据。
3、控制器:根据视图提出的请求,判断将请求和数据交给哪个模型处理,处理后的有关结果交给哪个视图更新显示。
(2)基于Servlet的MVC模式
基于Servlet的MVC模式的具体实现如下。
- 模型:一个或多个JavaBean对象,用于存储数据(实体模型由JavaBean类创建)和处理业务逻辑(业务模型,由一般的Java类创建)。
- 视图:一个或多个JSP页面,向控制器提交数据和为模型提供数据显示,JSP页面主要使用HTML标记和JavaBean 标记来显示数据。
- 控制器:一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的JavaBean,并将处理结果存放到实体模型 JavaBean 中,输出给视图显示。
例题: 使用JSP、Servlet、JavaBean 实现 MVC
使用MVC模式实现简单的用户登录验证程序,其中包括实体模型 User、业务模型 UserCheck、控制器 LoginCheckServlet 和两个视图页面,即登录页面和登录成功页面。
(1)定义实体模型来表示数据
User 类用于创建实体模型存储用户信息
package dto;
public class User {
private String name;
private String pwd;
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
(2)定义业务模型来处理业务
UserCheck 类用于判断用户名和密码是否正确
package service;
import dto.User;
public class UserCheck {
public boolean validate(User user){
if (user!=null && user.getName().equals("JSPMVC")){
if(user.getPwd().equals("MVC")){
return true;
}
return false;
}
return false;
}
}
(3)编写Servlet处理请求
LoginCheckServlet 完成请求控制
package servlet;
import dto.User;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import service.UserCheck;
import java.io.IOException;
@WebServlet(name = "LoginCheckServlet", value = "/LoginCheckServlet")
public class LoginCheckServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd=request.getParameter("pwd");
User user = new User();//实例化实体模型user
user.setName(name);//将数据存在模型user中
user.setPwd(pwd);//将数据存在模型user中
UserCheck uc =new UserCheck();//实例化业务模型userCheck
if(uc.validate(user)){
//将装有数据的实体模型user存储到request范围内
request.setAttribute("user" ,user);
RequestDispatcher dis=request.getRequestDispatcher("loginSuccess.jsp");
dis.forward(request,response);
}else{
response.sendRedirect("loginCheck.jsp");
}
}
}
(4)编写视图
登录页面loginCheck,jsp 的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="LoginCheckServlet" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="pwd"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td><input type="reset" value="重置"/></td>
</tr>
</table>
</form>
</body>
</html>
登录成功页面loginSuccess.jsp 的代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:useBean id=" user" type="dto.User" scope="request"/>
恭喜<jsp:getProperty name=" user" property="name"/>登陆成功!
</body>
</html>
10.2模型周期
在基于Servlet的MVC模式中,控制器Servlet 创建的实体模型JavaBean也涉及生命周期,生命周期分别为request、session 和application。下面以例题中的实体模型user来讨论这三种生命周期的用法
(1)request周期的模型
创建模型并将数据保存到模型中
在Servlet中需要这样的代码:
User user=new User ();//实例化模型user
user:setName(name);//将数据存在模型user中
user.setPwd(pwd);//将数据存在模型user中
将模型保存到request对象中并转发给视图JSP
在Servlet中需要这样的代码:
request.setAttribute("user",user);//将装有数据的模型user输出给视图loginSuccess.jsp 页面
RequestDispatcher dis=request.getRequestDispatcher("loginSuccess.jsp");
dis.forward(request,response);
request.setAttribute(”user",user)这句代码指定了查找 JavaBean 的关键字,并决定了
JavaBean的生命周期为 request。
视图更新
Servlet 所转发的页面,如 loginSuccessjsp 页面,必须使用 useBean 标记获得 Servlet所创建的JavaBean 对象(视图不负责创建JavaBean)
在JSP页面中需要使用这样的代码:
<jsp:useBean id="user" type="dto.User" scope="request"/>
<jsp:getProperty property="name" name="user"/>
标记中的id 就是 Servlet 所创建的模型 JavaBean,它和request 对象中的关键字对应。因为在视图中不创建JavaBean对象,所以在useBean标记中使用type属性,而不使用class属性。useBean标记中的scope必须和存储模型时的范围(request)一致。
(2)Session周期模型
创建模型并将数据保存到模型中
User user = new User();//实例化模型user
user.setName(name);/将数据存在模型user中
user.setPwd(pwd);//将数据存在模型user中
将模型保存到session对象中并转发给视图JSP
session.setAttribute("user",user);//将装有数据的模型user输出给视图loginSuccess.jsp 页面
RequestDispatcher dis=request.getRequestDispatcher("loginSuccess.jsp");
dis.forward(request,response);
session.setAttribute("user",user)这句代码指定了查找 JavaBean 的关键字,并决定了JavaBean的生命周期为 session。
视图更新
Servlet 所转发的页面,如 lginSuccess,jsp 页面,必须使用 useBean 标记获得 Servlet所创建的JavaBean对象(视图不负责创建 JavaBean)
<jsp:useBean id="user" type="dto.User" scope="session"/>
<jsp:getProperty property="name" name="user"/>
标记中的id就是 Servlet 所创建的模型JavaBean,它和session 对象中的关键字对应。因为在视图中不创建 JavaBean 对象,所以在 useBean 标记中使用type属性,而不使用class属性。useBean标记中的scope必须和存储模型时的范围(session)一致。
注:对于生命周期为 session 的模型,Servlet 不仅可以使用 RequestDispatcher 对象转发给JSP页面,还可以使用response 的重定向方法(sendRedirect0)定向到JSP页面
(3)application周期的模型
创建模型并将数据保存到模型中
User user = new User();//实例化模型user
user.setName(name);//将数据存在模型user中
user.setPwd(pwd);//将数据存在模型user中
将模型保存到application对象中并转发给视图JSP
application.setAttribute("user",user);//将装有数据的模型user输出给视图loginSuccess.jsp 页面
RequestDispatcher dis=request.getRequestDispatcher("loginSuccess.jsp");
dis.forward(request,response);
“application.setAttribute("user",user);这句代码指定了查找JavaBean的关键字,并决定了JavaBean的生命周期为application。
视图更新
Servlet 所转发的页面,例如 loginSuccess,jsp 页面,必须使用 useBean 标记获得 Servlet所创建的JavaBean对象(视图不负责创建JavaBean)。
<jsp:useBean id="user" type="dto.User" scope="application"/>
<jsp:getProperty property="name" name="user"/>
标记中的id 就是Servlet 所创建的模型JavaBean,它和application 对象中的关键字对应。因为在视图中不创建JavaBean对象,所以在 useBean标记中使用 type 属性,而不使用class 属性。useBean标记中的 scope 必须和存储模型时的范围(application)一致。
注:对于生命周期为session或application的模型,Servlet 不仅可以使用RequestDispatcher对象转发给JSP页面还可以使用response 的重定向方法(sendRedirect()))定向到JSP页面