java学习之服务器第26天( --form表单-- 四大域对象--cookie)

                你想要多大的成功, 你愿意为这份成功付出什么?

1.form表单

      定义: 相当于一个控件集合,里面包含多个控件,点"提交"后会把表单中的所有控件的值都传给action到的页面:

 通过post 的method方法传递时会隐藏表单中的所有值,可以在URL地址栏看到?号所跟的值,也就是表单中的值;

 表单有三个要素,  1,action 即点击提交后的跳转地址,

                        2: method 方法, 通过什么样的方式进行传递,

                        3: submit提交按钮, 通过单击按钮来提交内容.

  1.1 利用HTML创建一个form表单


1.2 通过Sevrlet实现一个表单!
public class Demo06 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		//防止请求数据乱码;
		request.setCharacterEncoding("UTF-8");
		String remember="";
		String username = "";
		
		//用Sevrlet实现一个表单;
		response.getWriter().write("<form action='/sh-web-03/servlet/demo07' method='post'>");
		response.getWriter().write("用户名<input type='text' name='username' value='"+username+"'><br/>");
		response.getWriter().write("密码<input type='text' name='password'><br/>");
		response.getWriter().write("记住<input type='checkbox' name='remember' ><br/>");
		response.getWriter().write("<input type='submit' value='提交'"+remember+">");
		response.getWriter().write("</form>");	
		
	}
1.3 获取表单提交数据的value值;

    1 . 通过表单提供的action =" URL" 找到表单提交到位置的Sevrlet, 从Sevrlet里面获取到想要的值;

           例如:    首先: 已知form表单提交的路径:<form action="/sh-web-03/demo01"  method="post">;

                      其次: 可以在提交的路径里面获取到form表单里面的值; 例如1.1中的图片

 1.4 获取form表单中值得方法; 

       1. 获取from表单中提交单个值:  type=  "text  " (输入框)---radio( 单选框 ) --checkbox( 复选框) --submit(提交)

             String  string= request.getParameter( " username" )

       2.获取表单提交多个值进行使用 例如: 使用 CheckBox 提交; 需要遍历获取, for each;

            String    [] hobbys =  request.getParameterValues("hobby" );

     3. 将请求中的参数放入到map集合中; 

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		// 防止请求数据乱码;
		request.setCharacterEncoding("UTF-8");
		Map<String, String[]> map = request.getParameterMap();
		 for (String  key : map.keySet()) {
			    String[] strings = map.get(key);
			    for (String string : strings) {
					response.getWriter().write(string);
				}
		}
		
	}
1. 4.获取到的表单数据可以给对象进行赋值, 对象要有表单数据的value这些属性
	String name = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		// 获取表单提交的多个值使用
		String[] hobbys = request.getParameterValues("hobby");
		String city = request.getParameter("city");
		//将值放到对象中去;用初始化;
		User user = new User(name, password, sex, hobbys, city);
		System.out.println(user);
1.5. 利用BeanUtils的一个方法直接 第三方类库, 第二个是参数的集合, key值是表单里面的name

              BeanUtils.populate( user, request.getParameter )

         注意: 1. 使用这个方法, 所使用的对象,必须是Javabean对象,  set/get/有参/无参 方法;

                 2. 表单中的name 必须和成员变量相对应.                

	String name = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		// 获取表单提交的多个值使用
		String[] hobbys = request.getParameterValues("hobby");
		String city = request.getParameter("city");
		//将值放到对象中去;用初始化;
		User user = new User(name, password, sex, hobbys, city);
		System.out.println(user);
2 .四大域对象

    一: ServletContext  

         1.生命周期: 当web应用被加载进容器时创建, 代表整个web应用的ServlerContext

                当服务器关闭,或者web应用被移除时, SevrletContext对象被销毁;

         2.作用范围:整个web应用.

         3.作用: 1.在不同的Servlet之间转发:( 存值取值 )

                    2.读取资源文件

                            1.   由于相对路径默认相对的是Java虚拟机启动的目录,所以我们直接写相对路径将会是相对于tomcat/bin目录, 所以是拿不到资源的,

                              如果写成绝对路径,当项目发布到其他环境的时候,绝对路径就错了,

                     2.    为了解决这个这个问题ServletContext提供了: this.getServletContext().getRealPath( "/1.properties" ), 给资源的一个虚拟路径, 将会返回该资源在当前环境的真实路径,

      this.getServletContext().getResourceAsStream(“/1.properties”),给一个资源的虚拟路径返回到该资源真实路径的流。

3、当在非servlet下获取资源文件时,就没有ServletContext对象用了,此时只能用类加载器

classLoader.getResourceAsStream(“../../1.properties”),此方法利用类加载器直接将资源加载到内存中,有更新延迟的问题,

 

 以及如果文件太大,占用内存过大。

classLoader.getResource(“../1.properties”).getPath(),直接返回资源的真实路径,没有更新延迟的问题。

  作用3 :获取全局配置信息:

	ServletContext context = this.getServletContext();
		
		// 作用2  获取context的配置信息 context 只有一个, 只能同过ServletContext来获取;
		String initParameter = context.getInitParameter("kuner"); // kuner是标签里面的name值;
		System.out.println(initParameter); // 也就是获取标签 里面的value值

 作用4: 请求转发 利用: 第一步:获取转发器, 第二步: 利用转发器进行请求转发

	// 第一步 通过context对象获取请求转发器
		//注意: 请求转发只能是本工程站内转发;
		//填转发路径是相对于你的工程;  /杠代表工程名后面的路径;  你要给他一个去往的路径;
		 RequestDispatcher requestDispatcher = this.getServletContext().getRequestDispatcher("/demo06");
		//第二步请求转发; 利用转发器  
		 requestDispatcher.forward(request, response);

二  request 域

        1. 声明周期: 在service 方法调用前 由服务器创建, 传入service方法, 整个请求结束, request声明结束

       2.作用范围: 整个请求链(  在请求转发过程中也存在 );

      3: 作用: 在整个请求链中共享数据,最常用到:在Servlet 中处理好的数据交给jsp 显示, 此时参数就可以放置在request中带过去;

三 : Session域

       HTTPSession 在服务器中, 为浏览器创建独一无二的内存空间, 在其中保存会话的相关信息.

     1. 声明周期: 在第一次调用request.getSession() 方法的时候, 服务器会检查是否已经有对应的Session,如果没有就在内存中创建一个Session并返回.

    当一段时间内Session没有被使用( 默认是30分钟),则服务器会销毁该Session. 如果服务器非正常关闭, 没有到期的Session也会跟着销毁.

           2. 如果调用Session提供的invalidate() ,可以立即销毁Session.

           3. 如果服务器正常关闭, Session 对象会进行钝化和活化操作. 同时如果服务器钝化的时间在Session默认销毁时间之内,

      则活化后Session还是存在的, 否则Session不存在.如果Javabean数据在Session 钝化是,没有实现serializable 则当Session活化时 , 会消失.

   作用范围: 一次会话;

四: PageContext 

    1. 声明周期: 当对jsp的请求开始, 当响应结束时销毁.

   2.作用范围:整个jsp页面, 是四大作用域中最小的一个.

作用: 

      1. 获取其他八大隐式对象, 可以认为是一个入口对象;

     2. 获取其所有域中的数据,

 pageContext 操作所有域中属性的方法

public java.lang.Object getAttribute(java.lang.String name,int scope)

public void setAttribute(java.lang.String name, java.lang.Object value,int scope)

public void removeAttribute(java.lang.String name,int scope)

pageContext 中代表域的常量

PageContext.APPLICATION_SCOPE

PageContext.SESSION_SCOPE

PageContext.REQUEST_SCOPE

PageContext.PAGE_SCOPE

findAttribute方法,在四大域中搜寻属性,搜寻的顺序是page域、request域、session域、application域,

从小域到大域开始搜索,如果搜索到就直接获取该值,如果所有域中都找不到,返回一个null(与el表达式不同,此处返回null,对网页是不友好的)

(3)跳转到其他资源 其身上提供了forward和include方法,简化重定向和转发的操作

3. cookie

       定义: 是web编程里一种客户端存储数据的方式( 通常是加密过的 ).

有些数据, 不是特别重要,但是用户又要经常用到, 比如: 网站用户的登录信息, 历史查看记录等等, 这些数据保存在你服务器上,会增大服务器压力, 你可以将这些数据保存到本地, 下次你访问网站的时候,服务器会主动去你的机器上读取这些数据并展现出来,

                注意:每个站点可以保存20个cookie:

                每个浏览器: 可以保存300个;

                每个cookIe 做多可以保存300个;

                cookie默认存活时间,一次会话( 浏览器关闭 )

               可以设置cookie存活时间, 浏览器就会将cookie生成一个文件保存到你的硬盘上去;

                cookie不能保存中文;

 setMaxAge (时间 秒) 设置cookie的存活时间 ;
 *     正值 是多少,浏览器就保存多少秒
 *     负值 浏览器不会储存cookie到硬盘中
 *         当浏览器关闭 会话结束 这个cookie被删除
 *      0 cookie被删除;

3: 创建cookie 

    第一步:                                             new cookie( cookie名, cookie值  );

   第二步: 给cookie 设置一个访问路径;       cookie.setPath( "/工程名/servlet");

   第三步: 设置cookie存活时间;                  cookie.setMaxAge( 300 );

   第四步: 添加cookie到响应中, 也就是到浏览器中 respone. addcookie( new cookie);  

		// 第一步 创建一个cookie对象       ----获取到的是long 加上个空字符串;
		 Cookie cookie = new Cookie("lastTime", System.currentTimeMillis()+"");
		 //设置cookie的保存路径
		 //路径"/" 表示该工程下的所有Sevrlet都能访问, 相当于按照工程名来存 /==/sh-web-03
		  // 注意 ---/Demo03 代表demo03这个工程;
		 ///sh-web-03/sevrlet  只能是Sevrlet目录下的网页(看配置文件Sevrlet)来访问 也就是Demo04能访问;
		 cookie.setPath("/sh-web-03/servlet");
		 //第三步 设置存活时间
		  cookie.setMaxAge(300);
		  //第四步 添加cookie到响应中 ,响应回浏览器
		  response.addCookie(cookie);
1. 第一次访问:目的是添加cookie, 第二次访问 目的是判断有没有cookie, 有你想要的cookie就读出来;

            1. 获取请求中的cookie( 也就是保存在网页上的cookie ),得到的是一个cookie数组; 

            2.遍历cookie 找到我想要的那个名字那个cookie; cookie.getName();

           3. 获取到cookie的value值. 用cookie.getValue;

            4. 可以将获取到的cookie值回写到响应中去 也就是回写到浏览器中, 

Cookie[] cookies = request.getCookies();
		  if (cookies!=null) {
			//cookie 里面有值  
			 //遍历
			  for (Cookie cookie : cookies) {
				 //找到我们刚才保存的cookie名字
				  if (cookie.getName().equals("lastTime")) {
					 //获取cookie的值
					  String value = cookie.getValue();
					  //将字符串转化成long型
					   long time = Long.parseLong(value);
					  //转换成时间
					  Date date =new Date(time);
					  //转换时间的格式;( 格式化时间)
					  SimpleDateFormat  format = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss");
					  //格式化date
					  String lastTime = format.format(date);
					 //写到
					  response.getWriter().write("上一次登录的时间:"+lastTime);
					  System.out.println("21234");
				}
			}

  

        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值