第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)

4.27 第六个war包相关实验记录与相关问题的回答


首先,运行readme.jsp文件,查看第七个war包的实验要求
第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第1张图片
从中可以看出实验要求我们了解Servlet的对象参数的作用域,以及其的使用方法,生命周期。此类问题我们在文章后面进行解释


源码部分

其实这次的源码部分,有点绕,我开始前没有搞清楚,把所有的代码,一起发了上来,其实理清思路之后,就会理解这次源码的安排,这次的源码分为独立的三个部分,分别对应着readme里的三个对象参数作用域,场景设置为
(1)servletContext——信息发布系统
(2)request——用于计算数据的网页
(3)httpSession——模拟购物页面
那么之后的讲解呢,我用webapp里面的目录命名为

1 dataOperation

第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第2张图片
这题运行页面如下,要求我们对其进行一个输入,有三个Servlet会完成以下工作 1、开方 2、乘十 3、显示
我输入的数据为100,之后运行显示成果为100(100开方为10,之后乘10=100)
第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第3张图片
页面代码没什么需要讲解的,我们重点看三个java文件
第一个java文件

package requestParam;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

/**
 * @author zzl
 * 
  • 只做一件事情的组件:开根号处理 * */ public class OperServlet extends HttpServlet { public void init(){} public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { //获取请求参数 String strcount=request.getParameter("count"); int count = (int)Double.parseDouble(strcount); //int count = (int)Integer.parseInt(strcount); //进行开根号处理 count = (int)Math.sqrt(count); String str=String.valueOf(count); //设置请求上属性的参数 request.setAttribute("count",str); // 转发给另一个Servlet来处理 request.getRequestDispatcher("operTwoServlet").forward(request,response); } }
  • 第一个servlet主要用来获取参数,并对其进行开根号的处理,之后将开完更好的数值转发给另一个Servlet进行处理
    这边传参的话,使用了doGet函数,之后运用.sqrt()得到开方后的数值

    第二个java文件

    package requestParam;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    
    /**
     * @author zzl
     * 
  • 只做一件事情的组件:乘10 * */ public class OperTwoServlet extends HttpServlet { public void init(){} public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { // 获取请求属性上的参数 String strcount=(String)request.getAttribute("count"); int count=Integer.parseInt(strcount); // 进行乘10处理 count *= 10; // 再次置入请求属性的参数 request.setAttribute("count",String.valueOf(count)); // 转发给另一个Servlet来处理 request.getRequestDispatcher("showServlet").forward(request,response); } }
  • 并无什么难度

    第三个java文件

    package requestParam;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    
    /**
     * @author zzl
     * 
  • 只做一件事情的处理,显示,即往客户端推流 * */ public class ShowServlet extends HttpServlet { public void init(){} public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); //获取请求属性上的参数 String strcount=(String)request.getAttribute("count"); String prefix = "开方十乘处理后的结果是:"; out.println(prefix+strcount); } }
  • 其实我认为这题的难点就在于理解在这种不同的servlet中,数值参数试怎么传递的,从这边我们可以看到此servlet是通过request.getParameterrequest.getAttribute来设置与获取值,使值在三个servlet中传递


    2 servletContextParam

    首先运行两个网站页面,查看页面显示
    在这里插入图片描述

    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第4张图片
    由于还未消息的发布,所以这边的值显示为null
    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第5张图片
    在这边进行发布
    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第6张图片
    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第7张图片
    在页面中发布自己想写的内容之后,可以在index.html文件中看到发布内容,以及时间
    java文件
    AdminServle

    package servletContextParam;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.*;
    import java.text.SimpleDateFormat;
    
    public class AdminServlet extends HttpServlet
    {
    	ServletContext sc;	//APP全局可见
    	
    	public void init()
    	{
    		sc=this.getServletContext();
    	}
    	
    	public void doGet(
    			HttpServletRequest request,
    			HttpServletResponse response) throws ServletException,IOException {
    		
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out=response.getWriter();
    		
    		// 获取request域中的传参
    		String newmsg=request.getParameter("msg");
    		// 对日期字符串格式的处理
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            // 获取当前系统时间
            String date=simpleDateFormat.format(new Date());
            // 获取上下文域中的参数
            String msg=(String)sc.getAttribute("msg");
            
            if(msg==null){
                String str="发布时间"
                		// 注意html中的空格的表示,转义表示
                		+ "      "	//相当于六个汉字的宽度
                		+ "      "
                		+ "    "+"发布内容"+"
    "
    +date+"     "+newmsg; sc.setAttribute("msg",str); //APP全局可见的参数 } else { String str=msg+"
    "
    +date+"     "+newmsg; sc.setAttribute("msg",str); } out.println("设置成功"); } }

    使用request.getParamete来获取request域中的传参


    3 shopping

    打开运行页面,在需要购买的产品名称中加入你想购买的产品,然后就可以进行添加
    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第8张图片
    我在这边添加了电视机,摁下按钮之后,就可以看到上面的文字 “产品已添加至购物车”,摁下返回键,点击查看购物车,
    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第9张图片
    可以看到我们已经将其加入购物车,至于前面的“4”,是当时为了验证能否通过序号添加而作的实验
    第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第10张图片

    package httpSessionParam;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    
    /**
     * @author zzl
     * 
  • 添加购物车 * */ public class AddServlet extends HttpServlet { public void init(){} public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { // 配置输出参数 response.setContentType("text/html;charset=utf-8"); // 输出对象,即开流 PrintWriter out=response.getWriter(); // 创建session对象,即创建会话 HttpSession session=request.getSession(); // 获取参数,强转为相应的类型,更方便使用 String product=(String)request.getParameter("product"); String shopping=(String)session.getAttribute("shopping"); // 设置参数的编码,避免中文乱码 String newproduct=new String(product.getBytes(),"utf-8"); if(shopping==null) // 首次,肯定是null状态 { //设置session域的属性参数值 session.setAttribute("shopping",newproduct); } else { String str=shopping+"
    "
    +newproduct; session.setAttribute("shopping",str); } out.println("产品已添加至购物车中!"); } }
  • 这次的传参是通过response.getWriter()
    PrintWriter out = response.getWriter();
    getWriter()返回一个PrintWriter object
    但是为什么用response呢?而不是new一个PrintWriter对象呢?

    代码首句的意思是拿到流(可以理解为管道)对象,而非response这个实体,他拿到了PrintWriter这个类的字符流对象,然后对流进行操作。操作的结果应该想要反映到response对应的位置,于是你要拿到属于response的流,而不是new一个出来。直接new的,那你再用流输出就不是输出到返回信息(response)了,那你输出也就没意义了。response是有基于流的概念,你从response拿到一个流,然后输出信息。
    这里的out对象是从Web容器中获取到的,而不是你新创建的,web容器加载servlet的时候已经为您创建好了out对象,你只要获取到然后使用就可以了!
    ShoppingServlet这边的传参方式与AddServlet相同,所以这边就不展示了


    之后回答老师readme.jsp中的问题

    servlet详解

    Servlet的对象参数的作用域

    1 request-Request对象
    2 session-HttpSession对象
    3 application-ServletContext对象
    

    在JavaWeb中,Servlet中三大域对象分别是request,session,ServletContext,其只要是用来存放共享数据的。

    三大作用域的使用,其本质是根据作用域的范围,生命周期决定其使用的方式.:
    request:每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发。
    session:每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间需要共享数据,只能使用session。
    application:应用对象,Tomcat 启动到关闭,表示一个应用,在一个应用中有且只有一个application对象,作用于整个Web应用,可以实现多次会话之间的数据共享。

    三个作用域具通用方法

    存放数据:setAttribute(name,value)

    获取数据:getAttribute(name);

    删除数据:removeAttribute(name);第七个war包源码以及操作详解与servlet三大域详解(第十一天学j2ee啦)_第11张图片

    三大域解读

    application(ServletContext)
    作用域
    application:应用对象,服务器启动到关闭,表示一个应用。在一个应用中有且只有一个application对象,作用于整个Web应用,可以实现多次会话之间的数据共享。

    生命周期
    创建:服务器启动时为每一个项目创建一个上下文对象(ServletContext)
    销毁:服务器关闭的时候 或者项目移除的时候

    session(HttpSession)
    作用域
    生命周期
    创建 : 第一次调用 request.getsession()

    html: 不会
    jsp: 会 getSession();
    servlet: 会

    销毁 :

    默认30分钟以后
    服务器关闭的时候
    session.invalidate() 手动销毁
    request(HttpServletRequest)
    作用域
    每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发。

    生命周期
    创建 : 请求开始的时候创建(访问服务器资源)。

    访问 html: 会
    访问 jsp: 会
    访问 servlet : 会

    销毁 : 响应开始的时候(资源请求结束)。


    这个第七个war包果然上难度了

    你可能感兴趣的:(每日一个小进步,大学冲!!!,j2ee好蓝,后端,java-ee,javaee,eclipse)