你想要多大的成功, 你愿意为这份成功付出什么?
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");
}
}