Servlet流程总结

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>");
	}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值