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

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


首先,运行readme.jsp文件,查看第七个war包的实验要求
在这里插入图片描述
从中可以看出实验要求我们了解Servlet的对象参数的作用域,以及其的使用方法,生命周期。此类问题我们在文章后面进行解释


源码部分

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

1 dataOperation

在这里插入图片描述
这题运行页面如下,要求我们对其进行一个输入,有三个Servlet会完成以下工作 1、开方 2、乘十 3、显示
我输入的数据为100,之后运行显示成果为100(100开方为10,之后乘10=100)
在这里插入图片描述
页面代码没什么需要讲解的,我们重点看三个java文件
第一个java文件

package requestParam;

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

/**
 * @author zzl
 * <li>只做一件事情的组件:开根号处理
 *
 */
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
 * <li>只做一件事情的组件:乘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
 * <li>只做一件事情的处理,显示,即往客户端推流
 *
 */
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

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

在这里插入图片描述
由于还未消息的发布,所以这边的值显示为null
在这里插入图片描述
在这边进行发布
在这里插入图片描述
在这里插入图片描述
在页面中发布自己想写的内容之后,可以在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中的空格的表示,转义表示
            		+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"	//相当于六个汉字的宽度
            		+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
            		+ "&nbsp;&nbsp;&nbsp;&nbsp;"+"发布内容"+"<br>"
            		+date+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+newmsg;
            sc.setAttribute("msg",str);	//APP全局可见的参数
        }
        else
        {
            String str=msg+"<br>"+date+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+newmsg;
            sc.setAttribute("msg",str);
        }
		out.println("设置成功");
	}
}

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


3 shopping

打开运行页面,在需要购买的产品名称中加入你想购买的产品,然后就可以进行添加
在这里插入图片描述
我在这边添加了电视机,摁下按钮之后,就可以看到上面的文字 “产品已添加至购物车”,摁下返回键,点击查看购物车,
在这里插入图片描述
可以看到我们已经将其加入购物车,至于前面的“4”,是当时为了验证能否通过序号添加而作的实验
在这里插入图片描述

package httpSessionParam;

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

/**
 * @author zzl
 * <li>添加购物车
 *
 */
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+"<br>"+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);在这里插入图片描述

三大域解读

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包果然上难度了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值