栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第七个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.*;


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.*;


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.*;


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中的空格的表示,转义表示
            		+ "      "	//相当于六个汉字的宽度
            		+ "      "
            		+ "    "+"发布内容"+"
" +date+"     "+newmsg; sc.setAttribute("msg",str); //APP全局可见的参数 } else { String str=msg+"
"+date+"     "+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.*;


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

三大域解读

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号