Servlet中的三大作用域

本文详细介绍了Servlet中的请求转发、重定向以及Servlet的三大作用域:request、session和servletContext(Application)。讨论了它们的特点、使用场景以及相关操作,如请求转发的效率优势、重定向的地址变化、ServletConfig获取web.xml配置、ServletContext访问webroot资源和Cookie、Session的管理。
摘要由CSDN通过智能技术生成

一个简单的登录

package com.cdsxt.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserServlet extends HttpServlet {
	private Map<String, String> userMap=new HashMap<String, String>();
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//设置请求编码
		//request.setCharacterEncoding(编码集)
		//请求设置编码的这个方法,默认只能对请求实体进行编码(只能对post有效),如果想对get方式同时有效,需要在配置端口号的地方,添加一个属性
		//useBodyEncodingForURI="true"
		request.setCharacterEncoding("utf-8");
		//获取请求的标记,判断走的分支
		String mark=request.getParameter("mark");
		
		if("regis".equals(mark)){
			userRegis(request, response);
		}else if("login".equals(mark)){
			userLogin(request,response);
		}
	}
	
	
	/**
	 * 用户登陆
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	public void userLogin(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//设置响应编码
		response.setHeader("content-type", "text/html;charset=utf-8");
		//获取表单参数
		String uname=request.getParameter("uname");
		System.out.println(uname);
		String pwd=request.getParameter("pwd");
		
		//获取PrintWriter对象
		PrintWriter pw=response.getWriter();
		
		if(uname.isEmpty()||pwd.isEmpty()){
			pw.write("<h1>登陆信息填写不完整,即将返回登陆页面!</h1>");
			response.setHeader("refresh", "3;url=login.html");
		}else{
			//获取正确密码
			String rightPwd=userMap.get(uname);
			
			if(pwd.equals(rightPwd)){
				pw.write("<h1>登陆成功,欢迎"+uname+"使用本系统!</h1>");
			}else{
				pw.write("<h1>用户名或密码错误,即将返回登陆页面!</h1>");
				response.setHeader("refresh", "3;url=login.html");
			}
		}
	}

	
	
	/**
	 * 用户注册
	 */
	public void userRegis(HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException {
		//设置响应编码
		response.setHeader("content-type", "text/html;charset=utf-8");
		//获取表单参数
		String uname=request.getParameter("uname");
		System.out.println(uname);
		String pwd=request.getParameter("pwd");
		String repwd=request.getParameter("repwd");
		
		//获取PrintWriter对象
		PrintWriter pw=response.getWriter();
		if(uname.isEmpty()||pwd.isEmpty()||repwd.isEmpty()){
			pw.write("<h1>注册信息填写不完整,即将返回注册页面!</h1>");
			response.setHeader("refresh", "3;url=regis.html");
		}else if(!pwd.equals(repwd)){
			pw.write("<h1>两次密码输入不一致,即将返回注册页面!</h1>");
			response.setHeader("refresh", "3;url=regis.html");
		}else if(userMap.containsKey(uname)){
			pw.write("<h1>该名字已经被注册,即将返回注册页面!</h1>");
			response.setHeader("refresh", "3;url=regis.html");
		}else{
			//将用户名和密码保存到map容器
			userMap.put(uname, pwd);
			//跳转到登陆页面
			pw.write("<h1>注册成功,即将跳转到登陆页面!</h1>");
			response.setHeader("refresh", "3;url=login.html");
		}
		
		
	}
}

请求转发

package com.java.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "LoginServlet"
)
public class LoginServlet extends HttpServlet {
    public LoginServlet() {
    }

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        String str = req.getAttribute("str") == null ? "" : (String)req.getAttribute("str");
        resp.getWriter().write("<html>");
        resp.getWriter().write("<head>");
        resp.getWriter().write("</head>");
        resp.getWriter().write("<body>");
        resp.getWriter().write("<form action='user' method='post'>");
        resp.getWriter().write("<font color='red'>" + str + "</font>");
        resp.getWriter().write("<br/>");
        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='登录'/>");
        resp.getWriter().write("</form>");
        resp.getWriter().write("</body>");
        resp.getWriter().write("</html>");
    }
}
package com.java.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "UserServlet"
)
public class UserServlet extends HttpServlet {
    public UserServlet() {
    }

    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 pwd = req.getParameter("pwd");
        if ("张三".equals(uname) && "123".equals(pwd)) {
            resp.getWriter().write("登录成功");
        } else {
            resp.getWriter().write("用户名或密码错误");
            req.setAttribute("str", "用户名或密码错误");
            req.getRequestDispatcher("login").forward(req, resp);
        }
    }
}

重定向

 

package com.java.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Auther:penghao
 * @Date:2019/3/22
 * @Description:${PACKAGE_NAME}
 * @version:1.0
 */
@WebServlet(name = "UserServlet")
public class UserServlet 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 pwd = req.getParameter("pwd");
        //处理请求信息
        if("张三".equals(uname)&&"123".equals(pwd)){
            resp.getWriter().write("登录成功");//响应处理结果
        }else{
            //resp.getWriter().write("用户名或密码错误");//响应处理结果
            //请求转发的使用
                //将数据存储到req对象中
                //req.setAttribute("str","用户名或密码错误");
                //请求转发
                //req.getRequestDispatcher("login").forward(req,resp);
            //重定向
                resp.sendRedirect("login");
                return;
        }
    }
}

servlet跳转的两种方式的特点:

 请求转发:
        语法:
            request.getRequestDispacher(地址).forward(请求对象,响应对象)

        特点:
            1)整个过程只有一次请求
             2)地址不会发生改变
             3)不能访问外部资源
             4)效率偏高
             5)绝对路径的/  代表根目录之后的/
             6)一般习惯性在请求转发之后调用一个return


    重定向:
        语法:
            response.sendRedirect(地址)


        特点:
            1)整个过程只有两次请求
             2)地址会发生改变
             3)能访问外部资源
             4)效率偏低
             5)绝对路径的/  代表端口号之后的/
             6)一般习惯性在重定向之后调用一个return

路径总结:

    请求转发的绝对路径的/ 代表的是根目录之后

    重定向的绝对路径的/ 代表的是端口号之后

    页面的绝对路径的/  代表的是端口号之后

文件下载

	public void download(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
//		设置下载的指定编码集,浏览器只支持iso8859-1
		String file = new String("下载的电影.rar".getBytes("utf-8"),"iso8859-1");
//		设置下载的响应头
		response.setHeader("content-disposition", "attachment;filename="+file);
//		设置 输入流
		InputStream is = new FileInputStream("D:/电影.rar");
//		设置输出流  response.getOutputStream(),将资源输出到浏览器
		OutputStream out = response.getOutputStream();
//		输出资源
		int len = 0;
		byte[] b = new byte[8192];
		while((len=is.read(b))!=-1){
			out.write(b,0,len);
		}
//		刷新
		out.flush();
//		关流
		out.close();
		is.close();
	}

ServletConfig对象

作用:
        用于获取web.xml中的配置信息


    需要掌握的方法:
        获取config对象:
            this.getServletConfig()

        获取<servlet-name>的值:
            config对象.getServletName()

        获取<init-param>的值:
            通过键获取值:
                config对象.getInitParameter(键名)    返回String

            获取键集合:
                config对象.getInitParameterNames()   返回Enumeration
        
        获取ServletContext对象:
            config对象.getServletContext()

ServletContext对象(Application):

获取context对象:
        this.getServletContext()


    作为作用域使用:
       基本的四个方法。
    

    获取<context-param>标签的值:
        通过键获取值:
                context对象.getInitParameter(键名)    返回String

        获取键集合:
                context对象.getInitParameterNames()   返回Enumeration


    获取webroot下的资源(重要):
        获取资源的运行绝对路径:
            context对象.getRealPath(路径)   返回String


        将资源以流的方式读入:
            context对象.getResourceAsStream(路径)   返回InputStream


        获取目录下的资源路径集合:
            context对象.getResourcePaths(目录的路径)   返回Set<String>

        注意点:
            使用ServletContext对象的方法,如果需要传入路径写不写/都是代表绝对路径,并且绝对路径的/代表WebRoot,使用这个对象的方法全部加上/即可。

Cookie对象:

特点:
        1)保存在客户端上
        2)不适合保存大量数据
        3)效率低
        4)不安全

    语法:
        创建cookie对象:
            new Cookie(键,值)

        设置cookie的有效期:
            cookie对象.setMaxAge(秒数)

        响应cookie对象给浏览器:
            response.addCookie(cookie对象)

        获取客户端上的cookie信息:
            request.getCookies()  -->  Cookie[]


        注意:
            1)如果没有设置cookie的有效期则保存在内存中,当浏览器关闭,则内存中的所有cookie全部清空。设置了有效期,则会被保存在硬盘上,有效期一过就会失效。
            2)使cookie立即失效,创建一个同键的cookie,将时间置为0,响应给客户端即可。

 

 

session会话对象:

特点:
        1)保存在服务器的
        2)适合保存大量数据(一般只用来保存用户信息)
        3)效率高
        4)安全的


    语法:
        获取session对象:
            request.getSession()


        作为作用域使用:
            四个方法


        设置最大空闲时间:
            session对象.setMaxInactiveInterval(秒数)
                注意:
                    1)最大空闲时间和最大有效期的区别
                    2)如果没有设置最大空闲时间,默认是看web.xml中的<session-config>配置,不修改是30分钟


        使session强制失效:
            session对象.invalidate()

什么叫一次会话(session的作用范围)

     简单的说,打开浏览器,访问服务器,直到浏览器关闭,称为一次会话。严格的说,根据session的生成机制。

session的生成机制:
        首先服务器必须调用request.getSession(),如果请求头中没有jsessionId则服务器一定会创建一个新的session对象,如果请求头中有jsessionId则服务器会找到对应的session对象,如果该对象已经失效,则会创建一个新的session对象,如果没有失效则使用找到的这个session对象。

 

 

request的作用范围:同一次请求,一次请求

session的作用范围:同一次会话,关闭浏览器,默认30分钟有效期结束

servletContext(Application)的作用范围:同一web项目,关闭服务器

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值