Servlet流程总结
浏览器发起请求到服务器(请求)
服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法执行进行请求处理
//设置请求编码格式
//设置响应编码格式
//获取请求信息
//处理请求信息
//创建业务层对象
//调用业务层对象的方法
//响应处理结果
数据流转流程:
浏览器------>服务器------->数据库
浏览器<------服务器<-------数据库
请求转发
问题:服务器在接收到浏览器的请求后,仅仅使用一个Servlet 进行请求处理,会造成不同的 Servlet 逻辑代码冗余,Servlet 的职责不明确。
解决:使用请求转发。*请求转发学习:
* 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
* 使用:
* req.getRequestDispatcher("要转发的地址").forward(req, resp);
* 地址:相对路径,直接书写servlet的别名即可。
* 特点:
* 一次请求,浏览器地址栏信息不改变。
* 注意:
* 请求转发后直接return结束即可。
Request 对象作用域
问题:使用请求转发后,不同的 Servlet 之间怎么进行数据的共享呢?或者说数据怎么从一个 servlet 流转给另外一个 Servlet 呢?
解决:使用 request 对象的作用域使用request对象实现不同servlet的数据流转
使用:
request.setAttribute(object name,Object value);
request.getAttribute(Object obj)作用:解决了一次请求内的不同 Servlet 的数据(请求数据+其他数据)共享问题。
作用域:基于请求转发,一次请求中的所有 Servlet 共享
注意:使用 Request 对象进行数据流转,数据只在一次请求内有效。
特点:服务器创建
每次请求都会创建
生命周期一次请求
PageServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PageServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置相应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求
//响应处理结果
//获取request作用域数据
String str=(String)req.getAttribute("str")==null?"":(String) req.getAttribute("str");
System.out.println(str);
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<font color='red' size='20px'>"+str+"</font>"); //必须把这句放在表单外面,否则将会出错
resp.getWriter().write("<form action='login' method='get'>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
resp.getWriter().write("<input type='submit' value='登录'/><br/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
LoginServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dym.pojo.User;
import com.dym.service.LoginService;
import com.dym.service.impl.LoginServiceImpl;
/**
*请求中文乱码解决:
* 1、使用String进行数据重新编码 核心数据用这种方式
* uname=new String(uname.getBytes("iso8859-1"),"utf-8");
* 2、使用公共配置
* get方式:
* 步骤一:req.setCharacterEncoding("utf-8");
* 步骤二:
* 在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性 useBodyEncodingForURI="true"
* post方式:
* req.setCharacterEncoding("utf-8");
* Servlet流程总结:
* 浏览器发起请求到服务器(请求)
* 服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
* 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
* servlet的方法执行进行请求处理
* //设置请求编码格式
* //设置响应编码格式
* //获取请求信息
* //处理请求信息
* //创建业务层对象
* //调用业务层对象的方法
* //响应处理结果
*请求转发学习:
* 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
* 使用:
* req.getRequestDispatcher("要转发的地址").forward(req, resp);
* 地址:相对路径,直接书写servlet的别名即可。
* 特点:
* 一次请求,浏览器地址栏信息不改变。
* 注意:
* 请求转发后直接return结束即可。
*request作用域:
* 解决了一次请求内的servlet的数据共享问题
*重定向:
* 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
* 使用:
* resp.sendRedirect(String uri);
* 示例:
* resp.sendRedirect("/login/main");
* 特点:
* 两次请求,两个request对象。
* 浏览器地址栏信息改变
* 时机:
* 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
* 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
*
* @author Administrator
*
*/
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式:
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname=req.getParameter("uname");
//使用String进行数据重新编码
// uname=new String(uname.getBytes("iso8859-1"),"utf-8"); //解决了乱码问题
String pwd=req.getParameter("pwd");
System.out.println(uname+":"+pwd);
//处理请求信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkLoginService(uname, pwd);
System.out.println(u);
//响应处理结果
if(u!=null){
resp.getWriter().write("登录成功");
}else{
//resp.getWriter().write("登录失败");
// resp.getWriter().write("<html>");
// resp.getWriter().write("<head>");
// resp.getWriter().write("</head>");
// resp.getWriter().write("<body>");
// resp.getWriter().write("<form action='login' method='get'>");
// resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
// resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
// resp.getWriter().write("<input type='submit' value='登录'/><br/>");
// resp.getWriter().write("</form>");
// resp.getWriter().write("</body>");
// resp.getWriter().write("</html>");
//使用request对象实现不同servlet的数据流转
req.setAttribute("str", "用户名或密码错误");
//使用请求转发
req.getRequestDispatcher("page").forward(req, resp);
//请求转发后直接return结束即可。
return;
}
}
}
重定向
问题:如果当前的请求,Servlet 无法进行处理怎么办?
如果使用请求转发,造成表单数据重复提交怎么办?解决:使用重定向
使用:response.sendRedirect(“路径”).
本地路径为:uri
网络路径为:定向资源的 URL 信息特点:两次请求
浏览器地址栏信息改变
避免表单重复提交
*重定向:
* 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
* 使用:
* resp.sendRedirect(String uri);
* 示例:
* resp.sendRedirect("/login/main");
* 特点:
* 两次请求,两个request对象。
* 浏览器地址栏信息改变
* 时机:
* 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
* 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
LoginServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dym.pojo.User;
import com.dym.service.LoginService;
import com.dym.service.impl.LoginServiceImpl;
/**
*请求中文乱码解决:
* 1、使用String进行数据重新编码 核心数据用这种方式
* uname=new String(uname.getBytes("iso8859-1"),"utf-8");
* 2、使用公共配置
* get方式:
* 步骤一:req.setCharacterEncoding("utf-8");
* 步骤二:
* 在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性 useBodyEncodingForURI="true"
* post方式:
* req.setCharacterEncoding("utf-8");
* Servlet流程总结:
* 浏览器发起请求到服务器(请求)
* 服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
* 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
* servlet的方法执行进行请求处理
* //设置请求编码格式
* //设置响应编码格式
* //获取请求信息
* //处理请求信息
* //创建业务层对象
* //调用业务层对象的方法
* //响应处理结果
*请求转发学习:
* 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
* 使用:
* req.getRequestDispatcher("要转发的地址").forward(req, resp);
* 地址:相对路径,直接书写servlet的别名即可。
* 特点:
* 一次请求,浏览器地址栏信息不改变。
* 注意:
* 请求转发后直接return结束即可。
*request作用域:
* 解决了一次请求内的servlet的数据共享问题
*重定向:
* 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
* 使用:
* resp.sendRedirect(String uri);
* 示例:
* resp.sendRedirect("/login/main");
* 特点:
* 两次请求,两个request对象。
* 浏览器地址栏信息改变
* 时机:
* 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
* 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
*
* @author Administrator
*
*/
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式:
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname=req.getParameter("uname");
//使用String进行数据重新编码
// uname=new String(uname.getBytes("iso8859-1"),"utf-8"); //解决了乱码问题
String pwd=req.getParameter("pwd");
System.out.println(uname+":"+pwd);
//处理请求信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkLoginService(uname, pwd);
System.out.println(u);
//响应处理结果
if(u!=null){
//请求转发
//req.getRequestDispatcher("main").forward(req, resp);
//重定向
resp.sendRedirect("/login/main");
return;
}else{
//使用request对象实现不同servlet的数据流转
req.setAttribute("str", "用户名或密码错误");
//使用请求转发
req.getRequestDispatcher("page").forward(req, resp);
//请求转发后直接return结束即可。
return;
}
}
}
MainServlet.java
package com.dym.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MainServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求信息
//响应处理结果
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<h3>欢迎"+req.getParameter("uname")+"访问dym管理系统</h3>");
resp.getWriter().write("<hr>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}