
getRequestURI():获取请求的资源路径
http://localhost:8080
/servlet/loginServlet
getRequestURL():获取请求的统一资源定位符(绝对路径)
http://localhost:8080/servlet/loginServlet
getRemoteHost():获取客户端的主机
getRemoteAddr():获取客户端的ip
getHeader():获取请求头
getParameter():获取请求的参数
getParameterValues():获取请求的参数(多个值的时候使用)
getMethod():获取请求的方式get或post
setAttribute(key,value):设置域数据
getAttribute(key):获取域数据
getRequestDispatcher():获取请求转发对象(请求转发的核心对象)
需求:在一个表单提交数据给Servlet,在该Servlet中通过HttpServletRequest对象获取相关数据
package com.li.servlet.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "HttpServletRequestMethods", value = "/requestMethods")
public class HttpServletRequestMethods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这里我们使用request对象,获取表单提交的各种数据
//System.out.println("HttpServletRequestMethods doPost()被调用...");
//1.获取和http请求头相关的信息
System.out.println("请求的资源URI= " + request.getRequestURI());
System.out.println("请求的统一资源定位符(绝对路径)URL= " + request.getRequestURL());
System.out.println("请求的客户端ip地址= " + request.getRemoteAddr());
/*
getRemoteAddr()应用:发现某个ip在10s内访问的次数超过100次,就封ip
实现思路:1用一个集合concurrentHashMap[k=ip v=访问次数] 2启动线程定时扫描 3做出相应处理
*/
//如果我们希望得到请求的头的相关信息,可以直接使用request.getHeader("请求头字段名")
System.out.println("http请求头HOST= " + request.getHeader("Host"));
System.out.println("该请求发起的地址是= " + request.getHeader("Referer"));
//请获取访问网站的浏览器是什么?
String userAgent = request.getHeader("User-Agent");
//User-Agent= Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
String[] s = userAgent.split(" ");//使用空格分割
//取最后一个字符,再用 /分割,取第一个字符
System.out.println("浏览器的种类= " + s[s.length - 1].split("\\/")[0]);
System.out.println("http请求方式= " + request.getMethod());
//2.获取和请求参数相关的信息,要去在返回数据前获取参数
//username=&pwd=&hobby=lb&hobby=cc
//2.1获取表单的数据[单个数据]
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
//2.2获取表单一组数据[多个数据]
String[] hobbies = request.getParameterValues("hobby");
System.out.println("username= " + username);
System.out.println("pwd= " + pwd);
//增强for循环的快捷键 iter->回车即可
for (String hobby : hobbies) {
System.out.println("hobby= " + hobby);
}
//推而广之,如果是单选,下拉框等,获取数据的方法大同小异
}
}
html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<h1>注册用户</h1>
<!--注意:这里的requestMethods不是你的类名,是你在web.xml里面(或者注解里面)配置的<url-pattern>-->
<form action="http://localhost:8080/servlet_demo/requestMethods" method="post">
u:<input type="text" name="username"/><br/><br/>
p:<input type="password" name="pwd"/><br/><br/>
选择你最喜欢的三国人物:
<input type="checkbox" name="hobby" value="lb">刘备
<input type="checkbox" name="hobby" value="cc">曹操
<input type="checkbox" name="hobby" value="sq">孙权<br/><br/>
<input type="submit" value="注册用户">
</form>
</body>
</html>
浏览器中访问html页面,输入数据,点击注册:
后台输出如下:
获取doPost参数中文乱码解决方法,设置编码类型request.setCharacterEncoding("UTF-8");
注意要写在获取参数之前:
注意:如果通过PrintWriter writer,有返回数据给浏览器,建议将获取参数的代码写在writer.print()之前,否则可能获取不到参数值(post)
处理http响应数中文乱码问题
再次理解HTTP协议响应Content-Type的含义,比如text/html,text/plain,application/x-tar
Content-Type表示返回的数据类型,浏览器会根据这个类型来解析数据,详见HTTP协议MIME类型
目前我们学习的都是一次请求,对应一个Servlet
在实际的开发中,往往业务比较复杂,需要在一次请求中,使用到多个Servlet完成一个任务(Servlet链,流水作业)
实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理
HttpServletRequest对象(也叫request对象)提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其他web资源处理
例子
需求:浏览器在某html页面输入数据,checkServlet根据该数据对进行操作,如果输入的数据为“tom”,就将其设置为“管理员”,如果不是,就设置为“普通用户”,由managerServlet向服务器返回数据
CheckServlet:
package com.li.servlet.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(urlPatterns = {"/checkServlet"})
public class CheckServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CheckServlet doPost()被调用...");
//根据用户名来确定该用户是什么身份
String username = request.getParameter("username");
//注意:如果是同一个request对象(请求转发),那么可以在不同的Servlet中使用getParameter取出该参数
if ("tom".equals(username)) {
//分配权限
//request对象是一个域对象,通过request对象,在实现转发时,
// 把数据通过request对象带给其他web资源处理
request.setAttribute("role", "管理员");//k-v
} else {
request.setAttribute("role", "普通用户");//k-v
}
//获取分发器
/**
* 1. /managerServlet写的是想转发的Servlet的url-pattern
* 2. / 会被解析成 /servlet_demo
* 因此请求转发是不可能转发到外网去的
* 3.forward(request,response)表示把当前的request和response对象传递给下一个Servlet使用,
* 保证了下一个Servlet和当前的Servlet使用的是同一个request和response对象
*/
RequestDispatcher requestDispatcher =
request.getRequestDispatcher("/managerServlet");
requestDispatcher.forward(request, response);
}
}
ManagerServlet:
package com.li.servlet.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = {"/managerServlet"})
public class ManagerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ManagerServlet doPost()被调用...");
//因为是同一个request对象,因此可以用request.getParameter("username")获取username
String username = request.getParameter("username");
String role = (String) request.getAttribute("role");//k-v
//输出信息
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("用户名:" + username + "<br/>");
writer.print("role:" + role);
writer.flush();
writer.close();
}
}
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="http://localhost:8080/servlet_demo/checkServlet" method="post">
u:<input type="text" name="username"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
redeployTomcat,在浏览器中访问http://localhost:8080/servlet_demo/login.html,输入数据,点击登录,可以看到地址栏变为http://localhost:8080/servlet_demo/checkServlet,但没有变为managerServlet(地址会保留在第一个Servlet的URL)


浏览器地址不会变化(地址会保留在第一个Servlet的URL)
在同一次HTTP请求中,进行多次转发,仍然是一次HTTP请求
在同一次HTTP请求中,进行多次转发,多个Servlet可以共享request域/对象的数据,即request域/对象的数据(参数,属性)的作用域,是在一次HTTP请求有效
因为是同一个request对象(数据上来讲)
可以转发到WEB-INF目录下
不能访问当前WEB工程外的资源
因为浏览器地址栏会停留在第一个Servlet,如果你刷新页面,会再次发出请求(并且会带数据)。
所以在支付页面情况下,不要使用请求转发,否则会造成重复支付 [解决方案可以使用重定向]
通过HttpServletRequest对象获取到访问服务的的浏览器名称
通过字符串分割,14.2已完成
请想办法获取到 JSESSIONID的值

//获取 JSESSIONID的值
String cookie = request.getHeader("Cookie");
String[] s1 = cookie.split(";");
String[] strings = s1[0].split("=");
System.out.println("JSESSIONID的值= "+strings[1]);
下面是一个表单,完成如下功能
(1)编写一个RegisterServlet,能够接收到提交的各种数据,并获取浏览器所在电脑的操作系统和位数
(2)并把接收到的数据返回给浏览器显示
(3)注意处理中文乱码问题
(4)暂不处理文件提交
RegisterServlet:
package com.li.servlet.request.homework;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@WebServlet(urlPatterns = {"/registerServlet"})
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取表单提交的数据
//先设置编码类型
request.setCharacterEncoding("utf-8");
//单个数据使用 getParameter
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
String pwd2 = request.getParameter("pwd2");
//多个数据使用getParameterValues
String[] sports = request.getParameterValues("sport");
String gender = request.getParameter("gender");
String city = request.getParameter("city");
String introduce = request.getParameter("introduce");
//2.获取用户浏览器所在电脑的操作系统和位数
//2.1法一-字符串分割
//Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
String User_Agent = request.getHeader("User-Agent");
//String[] s = User_Agent.split(" ");//使用空格分割
//s[1]="(Windows" 取出索引为1及之后的字符串
//String OS = s[1].substring(1);
//s[5]=x64;
//String OSNum = s[5].substring(1, 3);
//2.2法二-正则表达式
String regStr = "\\((.*)\\)";
Pattern compile = Pattern.compile(regStr);
Matcher matcher = compile.matcher(User_Agent);
matcher.find();//因为只有一组,所以没有必要使用循环
//String group = matcher.group(0);//(Windows NT 10.0; Win64; x64; rv:106.0)
String group1 = matcher.group(1);//Windows NT 10.0; Win64; x64; rv:106.0
String[] split = group1.split(";");
//System.out.println(split[0]);//Windows NT 10.0
//System.out.println(split[1]);// Win64
//3.返回输出
//设置编码类型
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("你的用户名称:" + username + "<br/>");
writer.print("你的用户密码:" + pwd + "<br/>");
writer.print("你的确认密码:" + pwd2 + "<br/>");
writer.print("喜欢的运动:");
for (String sport : sports) {
writer.print(sport + " ");
}
writer.print("<br/>你的性别:" + gender + "<br/>");
writer.print("喜欢的城市:" + city + "<br/>");
writer.print("自我介绍:" + introduce + "<br/>");
writer.print("电脑操作系统:" + split[0] + "<br/>");
writer.print("位数:" + split[1].trim() + "<br/>");//trim()去掉字符串左右两边的空格
writer.flush();
writer.close();
}
}
register_form.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="http://localhost:8080/servlet_demo/registerServlet" method="post">
用户注册信息<br/>
用户名称:<input type="text" name="username"/><br/>
用户密码:<input type="password" name="pwd"/><br/>
确认密码:<input type="password" name="pwd2"/><br/>
请选中你喜欢的运动项目<br/>
<input type="checkbox" name="sport" value="lq">篮球<br/>
<input type="checkbox" name="sport" value="zq">足球<br/>
<input type="checkbox" name="sport" value="sq">手球<br/>
请选中你的性别<br/>
<input type="radio" name="gender" value="men">男<br/>
<input type="radio" name="gender" value="women">女<br/>
请选中你喜欢的城市
<select name="city">
<option>--请选中--</option>
<option value="gz">广州</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
</select><br/>
自我介绍<textarea name="introduce"></textarea><br/>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>

在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
我有一个任务列表(名称、starts_at),我试图在每日View中显示它们(就像iCal)。deftodays_tasks(day)Task.find(:all,:conditions=>["starts_atbetween?and?",day.beginning,day.ending]end我不知道如何将Time.now(例如“2009-04-1210:00:00”)动态转换为一天的开始(和结束),以便进行比较。 最佳答案 deftodays_tasks(now=Time.now)Task.find(:all,:conditio
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相
ruby1.9.3dev(2011-09-23修订版33323)[i686-linux]轨道3.0.20最近为什么在与DateTimeonRails相关的RSpecs项目上工作我发现在给定日期以下语句发出的值date.end_of_day.to_datetime和date.to_datetime.end_of_day虽然它们表示相同的日期时间,但比较时返回false。为了确认这一点,我打开了Rails控制台并尝试了以下操作1.9.3dev:053>monday=Time.now.monday=>2013-02-2500:00:00+05301.9.3dev:054>monday.cla
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
我找到了这个方法here.start=DateTime.nowsleep15stop=DateTime.now#minutesputs((stop-start)*24*60).to_ihours,minutes,seconds,frac=Date.day_fraction_to_time(stop-start)我有以下错误:`':privatemethod`day_fraction_to_time'calledforDate:Class(NoMethodError)我检查了/usr/lib/ruby/1.9.1/date.rb并找到了它:defday_fraction_to_time(
一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024
这个问题在这里已经有了答案:Errorinstallingmysql2:Failedtobuildgemnativeextension(32个答案)关闭5年前。我不知道在ubuntu上安装mysql2:(sudogeminstallmysql2Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingmysql2:ERROR:Failedtobuildgemnativeextension.currentdirectory:/var/lib/gems/2.3.0/gems/mysql2-0.4.4/ext/my
我正在使用sass为我正在开发的一个简单的静态网站编写css。我运行了sass--watchcustom.scss:custom.css,它在启动时编译良好,并显示消息:Sassiswatchingforchanges.PressCtrl-Ctostop.overwritecustom.css但是,每当我更新.scss文件时,什么也没有发生。我以前没有在Rails应用程序的上下文之外使用过SASS,所以我想知道我是否遗漏了什么?我的scss文件也非常简单,所以我怀疑它有什么问题,特别是因为它在第一次运行时就可以工作。sass-v报告Sass3.1.16(BrainyBetty),在Li