4.27 第六个war包相关实验记录与相关问题的回答
首先,运行readme.jsp文件,查看第七个war包的实验要求
从中可以看出实验要求我们了解Servlet的对象参数的作用域,以及其的使用方法,生命周期。此类问题我们在文章后面进行解释
其实这次的源码部分,有点绕,我开始前没有搞清楚,把所有的代码,一起发了上来,其实理清思路之后,就会理解这次源码的安排,这次的源码分为独立的三个部分,分别对应着readme里的三个对象参数作用域,场景设置为
(1)servletContext——信息发布系统
(2)request——用于计算数据的网页
(3)httpSession——模拟购物页面
那么之后的讲解呢,我用webapp里面的目录命名为
这题运行页面如下,要求我们对其进行一个输入,有三个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
* 只做一件事情的组件:开根号处理
*
*/
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中传递
由于还未消息的发布,所以这边的值显示为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域中的传参
打开运行页面,在需要购买的产品名称中加入你想购买的产品,然后就可以进行添加
我在这边添加了电视机,摁下按钮之后,就可以看到上面的文字 “产品已添加至购物车”,摁下返回键,点击查看购物车,
可以看到我们已经将其加入购物车,至于前面的“4”,是当时为了验证能否通过序号添加而作的实验
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中的问题
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);
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包果然上难度了