博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习记录 Day3(Servlet进阶)
阅读量:3901 次
发布时间:2019-05-23

本文共 10011 字,大约阅读时间需要 33 分钟。

文章目录

Day 3

2019年7月15日。

这是我学习JavaWeb的第三天。
这一天,我学到了以下的知识。

解决乱码问题

所有能设置编码的地方都统一设置 : 数据库,数据库字段,Servlet程序,请求,响应 , 前端,浏览器。

Request

获取属性:使用Request对象,可以获取到web项目的相关属性,代码如下:

import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class RequestDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//查看request对象的方式 System.out.println(request.getContextPath()); //获得web项目路径 System.out.println(request.getRequestURI()); //请求的URL路径 //Remote 远程 System.out.println(request.getRemoteUser()); //获得远程的用户名 System.out.println(request.getRequestedSessionId()); //获得SessionId; System.out.println(request.getServletPath()); //请求servlet的url System.out.println(request.getLocalAddr()); //获得本地地址 防火墙 System.out.println(request.getLocalName()); //获得本地名字 System.out.println(request.getLocalPort()); //获得访问的端口号 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response); }}

接收前端用户提交的参数:通过Request对象,可以获取到用户从前端提交的数据,步骤如下:

  1. 编写前端注册jsp页面
    • 表单提交的方式:get/post(推荐)
    • 表单提交的位置action:服务项目的路径/servlet对应的请求url
    • JSP中,获取项目路径的语法为:${pageContext.request.contextPath}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>    注册<%--JSP的注释--%><%--Form表单    action:代表要提交的路径,表单要提交到哪里 ,可以提交到一个Servlet        //提交到Servlet需要,获取到Web项目的路径下的Servlet    method: 提交表单的方式--%>

注册

用户名:

密码:

  1. 写处理前端提交信息的Servlet
    接收前端传递的控件信息,利用request.getParameter("控件的name")来实现
import javax.print.attribute.HashPrintRequestAttributeSet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;//处理前端提交过来的数据public class RequestDemo02 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过HttpServletRequest获取前端用户提交的信息 //req.getParameterValues(); 获得前端传递的控件信息,通过控件的name;但是可以接受多个参数的控件,比如(多选框....) //req.getParameter(); 获得前端传递的控件信息,通过控件的name; req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); //连接数据库,比较数据库中的信息是否匹配 if (username.equals("admin")&&password.equals("1234567")){
System.out.println("登录成功!"); //跳转到成功页面 }else {
System.out.println("登录失败!"); //提示重新注册 } System.out.println(username); System.out.println(password); }}
  1. 配置web.xml
RequsetDemo02
servlet.RequestDemo02
RequsetDemo02
/r2
  1. 提交测试
    1. 检查英文提交情况,服务器是否能接受成功
    2. 提交中文,查看乱码情况
    3. 设置编码统一,解决乱码问题

Request实现请求转发:通过Request对象,可以实现请求转发,代码如下:

import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class FormServlet1 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理乱码 req.setCharacterEncoding("UTF-8"); //处理前端的请求 String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("接收到的用户名:"+username+"\n密码:"+password+"\n爱好:"); String[] hobbies = req.getParameterValues("hobby"); for (String hobby : hobbies) {
System.out.println(hobby); } //重定向:服务器告诉客户端你应该请求另外一个地址; (地址栏会变) //resp.sendRedirect("url"); //转发:服务器把这个请求转向另外一个Servlet去处理; (地址栏不会变) //RequestDispatcher ,需要使用RequestDispatcher来进行处理,我们需要获得这个类 //参数就是他要转发到的页面 /* RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp"); requestDispatcher.forward(req,resp); */ try {
Thread.sleep(2000); } catch (InterruptedException e) {
e.printStackTrace(); } req.getRequestDispatcher("/success.jsp").forward(req,resp); }}

既然提到了转发,就不得不提到转发和重定向的区别,它们的区别如下:

  • 重定向:服务器告诉客户端,去请求另外一个地址(客户端行为
    • 地址栏会变
    • 不能携带参数
  • 转发:服务器自己转发到服务器上的另一个请求(服务器行为
    • 地址栏不会变
    • 可以携带参数

会话

会话字面意思:一次交流或交谈

在Web中,会话表示从浏览器打开某个网站,在这个网站中无论操作了什么,知道关闭浏览器,这一个过程,称之为一个会话。

怎么样算会话结束:

  • 客户端关闭了
  • 服务端销毁了

为什么要处理会话:

长期保持会话,无论用户关闭少次浏览器,这个会话都会存在。

比喻:

你昨天来了教室,我今天需要知道你昨天来了教室;

  1. 你留下一个标记,让我知道你来过
  2. 你告诉我你来这边,我需要记录你来了;

你:客户端

我 :服务器

Javaweb中针对这两个不同的端,诞生了两个小机制

  • cookie :在客户端留下一点东西,客户端下次带过来,我就知道你来过了。

    • 问:我的店铺非常大,怎么证明你来过?

    • 答:你开一个会员吧 , 我给你一张VIP卡,你下次带卡来,我就知道你来过了

  • Session:在服务器端登记你来过。

    • 问:你去理发店。怎么证明你来过?

    • 答:理发店收会员,在他的笔记本上记录了你的消息,下次你来直接报上大名就可以了。

Cookie

构造器:

Cookie cookie = new Cookie(String name,String value);Cookie cookie = new Cookie(String name,String value);Cookie cookie = new Cookie(String name,String value);

服务器响应cookie给客户端:

Response.addCookie(Cookie);Response.addCookie(Cookie);Response.addCookie(Cookie);

服务查看用户带来的请求是否有cookie:

Cookie[] cookies = Request.getCookie();//可以使用cookie来验证用户是否来过//判断cookies是否为空,然后遍历即可Cookie.getName();Cookie.getValue();

cookie测试用户是否来过

import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class CookieTest extends HttpServlet {
boolean flag = false; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决乱码问题: request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //检查请求的人是否带了Cookie //通过用户的请求,检查它是否有cookie Cookie[] cookies = request.getCookies(); System.out.println("cookie:"+cookies); if (flag){
//如果flag是真,来过 if (cookies!=null){
//你有cookie for (int i = 0; i < cookies.length ; i++) {
Cookie cookie = cookies[i]; if (cookie.getName().equals("lastLoginTime")){
response.getWriter().println("你上一次来的时间为:"+cookie.getValue()); System.out.println("刷新了cookie"); } } } }else {
//如果flag是真,没来过 response.getWriter().println("你是第一次来,还想要会员套餐"); System.out.println("给该用户一个cookie"); } //建立一个cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //设置cookie保存的时间 //cookie.setMaxAge(); //把这个cookie发给客户端 response.addCookie(cookie); //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+"")); flag = true; }}

Session

只要客户端一旦连接上服务器,服务器就会自动产生Session;

一个连接对应一个session,session可以在一个会话中传递信息;
通过setAttribute设置值。
通过getAttribute获得值。
由服务器端控制,服务器如果重启了,信息就会丢失!

假设从第一个网页将一个键值对存入到session后,到第二个网页后再从session取出来,示例代码如下:

  1. 第一个Servlet(将值存入session)
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;public class SessionTest extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题: req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); //Session由服务器自动创建,如何获得session //HttpSession 得到的sessioin对象 HttpSession session = req.getSession(); //得到sessionID,一次会话,一个seesionID; String id = session.getId(); resp.getWriter().println("获得的sessionId:\n"+id); String name = "qinjiang"; //向session中存入一个值; session.setAttribute("name",name); resp.getWriter().println("存入信息成功:"+name); }}
  1. 第二个Servlet(从session取出值)
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;//获得session存入的值public class SessionTest2 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题: req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); //获得 HttpSession session = req.getSession(); System.out.println("得到的SessionID:"+session.getId()); String name = (String) session.getAttribute("name"); resp.getWriter().println("得到的session存入的信息"+name); //Servlet < Seesion < WebContext }}

若想要让session失效,就需要让会话注销,方法如下:

  • 会话注销方法一
session.invalidate();//通过代码注销会话
  • 会话注销方法二
1

转载地址:http://eicen.baihongyu.com/

你可能感兴趣的文章
2012年上半年回顾与感悟
查看>>
SICP学习笔记 1.3.3 过程作为一般性的方法
查看>>
SICP学习笔记 1.3.4 过程作为返回值
查看>>
SICP学习笔记 2.1.1 实例: 有理数的算术运算
查看>>
SICP学习笔记 2.1.2 抽象屏障
查看>>
SICP学习笔记 2.1.3 数据意味着什么
查看>>
SICP学习笔记 2.1.4 扩展练习:区间算术
查看>>
SICP学习笔记 2.2.1 序列的表示
查看>>
甲方乙方 (1997)
查看>>
数学之美
查看>>
SICP学习笔记 2.2.2 层次性结构
查看>>
You raise me up
查看>>
SICP学习笔记 2.2.3 序列作为一种约定的接口
查看>>
SICP学习笔记 2.2.4 实例:一个图形语言
查看>>
SICP学习笔记 2.3.1 引号
查看>>
SICP学习笔记 2.3.2 实例:符号求导
查看>>
浪潮之巅
查看>>
少年派的奇幻漂流 Life of Pi (2012)
查看>>
我的2012年
查看>>
博客已搬迁至Github
查看>>