余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

JavaWeb10-request&response学习笔记

xiyangw 2023-05-14 11:46 16 浏览 0 评论

获取更多资源加微信公众号【Java帮帮】 (是公众号,不是微信好友哦)

学习交流请加【Java帮帮】自学交流QQ群553841695

JavaWeb10-request&response学习笔记

request&response

一.request和response的介绍

1. request和response的作用执行流程

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象

request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了.

执行流程:

1.浏览器发送请求

2.服务器接收请求,创建两个对象(request和response),将请求的信息封装request对象

3.找到对应的servlet,将这两个对象传递给servlet

4.Servlet收到请求,执行service方法,处理自己的业务逻辑,生成动态的内容,将内容返回给服务器

5.服务器收到内容之后,进行拆分,生成响应信息,返回给浏览器

6.浏览器解析

2. request和response的体系结构

Servlet的service方法中有两个参数servletRequest和servletResponse

httpServlet实现了service方法

将两个对象进行了强转

ServletRequest==>HttpServletRequest

ServletResponse==>HttpServletResponse

具体的实现类是由服务器帮我们创建的

tomact的实现类(了解)

org.apache.catalina.connector.RequestFacade

org.apache.catalina.connector.ResponseFacade

☆要想获取从浏览器发送过来的请求内容,找request就可以了

☆要想往浏览器写东西,找response就可以了

javax.servlet.Servlet接口中的service方法

public abstract void service(ServletRequest req, ServletResponse res)

javax.servlet.GenericServlet类中的service方法

public abstract void service(ServletRequest req, ServletResponse res)

javax.servlet.http.HttpServlet类中的service方法

在这个类中对service方法进行了重载

public void service(ServletRequest req, ServletResponse res)

protected void service(HttpServletRequest req, HttpServletResponse resp)

二.response

响应:要想往浏览器写东西,找response就可以了

1.response常用api简单介绍

2.response操作响应行(操作状态码)

格式:协议/版本 状态码 状态码说明

例如:HTTP/1.1 200 OK

在http响应行中,包括协议,版本号,以及有一个很重要的值,它叫做响应状态码.响应行中我们主要就是操作这些状态码,它可以有五种类型取值:

常用状态码

200请求成功(其后是对GET和POST请求的应答文档。)

302所请求的页面已经临时转移至新的url。(重定向)(配合location响应头使用)

304未按预期修改文档。(让浏览器读缓存)

客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since(什么时候修改的))头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

404没有找到文件或目录。(用户操作错误)

405请求中指定的方法不被允许

500请求未完成。服务器遇到不可预知的情况(代码错误)

504网关错误.

HttpServletResponse操作状态码方法

void setStatus(int sc): 设置状态代码.针对于非错误的状态码

例如:setstatus 200

void sendError(int status,String msg) throws IOException 设置错误状态码及信息

例如:response.sendError(404);报404错误

response.sendError(404,一不小心走丢了.........);报错误并且有错误信息

3.response操作响应头

http响应头的格式是 key/value的格式,可以有多个value值,以”,”分开.

例如:

Content-Encoding: gzip

Content-Length: 123

Content-Language: zh-cn

Content-Type: text/html; charset=GB2312

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT

HttpServletResponse操作响应头 API

public void setHeader(String name,String value)

用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值

(设置字符串形式的响应头 注意:若设置过,会覆盖)

public void addHeader(String name, String value)

用给定名称和值添加响应头。此方法允许响应头有多个值

(追加字符串形式的响应头 注意:若没有设置过则设置,若设置过则追加)

public void setIntHeader(String name, int value)

用给定名称和整数值设置响应头。如果已经设置了头,则新值将重写以前的值。

(设置整型的响应头)

public void addIntHeader(String name, int value)

用给定名称和整数值添加响应头。此方法允许响应头有多个值。

(添加整型的响应头)

public voidsetDateHeader(String name, long date)

用给定名称和日期值设置响应头。该日期根据距历元时间的毫秒数指定。如果已经设置了头,则新值将重写以前的值。(设置时间类型的响应头)

public void addDateHeader(String key, long date)

用给定名称和日期值添加响应头。该日期根据距历元时间的毫秒数指定。此方法允许响应头有多个值。(添加时间类型的响应头)

案例1:重定向

图解

实现:

New一个FirstServlet

//1.设置状态码

response.setStatus(302);

//2.设置相应头--跳转目录

response.setHeader(“location”,”http://localhost/day09/second”);

//response.setHeader(“location”,”day09/second”);

开发中我们使用sendRedirect(url);上面两部不需要只要一步实现

例如:response.sendRedirect(day09/second);

New一个SecondServlet

实现:

New一个Local1Servlet doget方法下

//1.设置状态码

response.setStatus(302);

//2.设置相应头--跳转目录

response.setHeader(“location”,”http://localhost/day09/local2”);

//response.setHeader(“location”,”day09/second”);

New一个Local2Servlet

案例2:定时跳转

在servlet中,我们通过 (应用注册成功以后给一个提示信息)

response.setHeader(refresh,3,url=http://localhost/day09/demo2.html);

或者setHeader改为addHeader

response.setHeader("refresh", "3,url=/day09/demo2.html");

response.setHeader("refresh","秒数;url=跳转路径");

在页面中,我们可以通过

<meta http-equiv="refresh" content="5;url=http://localhost/day09/responseDemo3">

页面中通过<meta http-equiv=””>方式操作时,也会将标签内容写入到http响应中。

4.response操作响应体

http响应正文是我们最终在浏览器上看到的结果。(页面上要显示的东西)

对于HttpServletResponse如果想要操作响应正文,需要通过response对象获取到输出流,将信息写回到浏览器端

获得向客户端进行数据输出的流对象

PrintWriter w = response.getWriter();字符流数据输出

例如:往页面输出表格:

response.setContentType(“text/html;charset=utf-8”);设置编码

PrintWriter w=response.getWriter(); 获取字符流

w.print(“<table border=’1’><tr><td>”);

w.print(“用户名<td><td>”);

w.print(“tom</td></tr>”);

w.print(“<tr><td><密码></td><td>1234”);

w.print(“</td></tr></table>”);

OutputStream out = response.getOutputStream();字节流数据输出

自己的东西用字符流,

别人的东西用字节流

响应中文乱码问题

默认情况下,编码格式是ISO-8859-1

response.setCharacterEncoding(“utf-8”);

设置响应流的编码

response.setHeader(“Content-Type”,”text/html;charset=utf-8”);

设置响应流的编码,并且通知浏览器用什么编码打开

<meta http-equiv=”Content-Type”content=”text/html;charset=UTF-8”>

网页上使用

开发常用respons.setContentType(text/html;charset=utf-8);

设置响应流的编码,并且通知浏览器用什么编码打开

操作响应正文注意事项

1.getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

2.getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。

Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎tomcat将调用close方法关闭该输出流对象。调用close的时候,会调用flushBuffer方法.自动关流

5.生成动态验证码

防止暴力攻击 以后开发上网找一个就可以了

代码:

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

//验证码

public class ImageCodeServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 使用java图形界面技术绘制一张图片

int charNum = 4;

int width = 30 * 4;

int height = 30;

// 1. 创建一张内存图片

BufferedImage bufferedImage = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

// 2.获得绘图对象

Graphics graphics = bufferedImage.getGraphics();

// 3、绘制背景颜色

graphics.setColor(Color.YELLOW);

graphics.fillRect(0, 0, width, height);

// 4、绘制图片边框

graphics.setColor(Color.BLUE);

graphics.drawRect(0, 0, width - 1, height - 1);

// 5、输出验证码内容

graphics.setColor(Color.RED);

graphics.setFont(new Font("宋体", Font.BOLD, 20));

// 随机输出4个字符

Graphics2D graphics2d = (Graphics2D) graphics;

String s = "ABCDEFGHGKLMNPQRSTUVWXYZ23456789";

Random random = new Random();

//session中要用到

String msg="";

int x = 5;

for (int i = 0; i < 4; i++) {

int index = random.nextInt(32);

String content = String.valueOf(s.charAt(index));

msg+=content;

double theta = random.nextInt(45) * Math.PI / 180;

//让字体扭曲

graphics2d.rotate(theta, x, 18);

graphics2d.drawString(content, x, 18);

graphics2d.rotate(-theta, x, 18);

x += 30;

}

// 6、绘制干扰线

graphics.setColor(Color.GRAY);

for (int i = 0; i < 5; i++) {

int x1 = random.nextInt(width);

int x2 = random.nextInt(width);

int y1 = random.nextInt(height);

int y2 = random.nextInt(height);

graphics.drawLine(x1, y1, x2, y2);

}

// 释放资源

graphics.dispose();

// 图片输出 ImageIO

ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

在网页上显示可以点击图片更换验证码

New一个code.html页面

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<img src="/day10/codeimg" alt="验证码" onclick="changeCode_(this)">

</body>

<script type="text/javascript">

function changeCode(){

//1.获取对象

var obj=document.getElementsByTagName("img")[0];

/*var obj=document.getElementsByTagName("img");

for(var i=0;i<arr.length;i++)

arr[i]="";

*/

//2.设置src属性

//obj.src="/day10/codeimg?i="+Math.random();

obj.src="/day10/codeimg?"+Math.random();

}

function changeCode_(obj){

obj.src="/day10/codeimg?"+Math.random();

}

</script>

</html>

常见的汉字:

String s = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";

三.request

请求:要想获取浏览器发送过来的参数,tongguorequest就可以了

1. request常用api简单介绍

HttpServletRequest对象用于封装http请求,对于http请求它有三部分组成,http请求行,http请求头及请求正文,下图描述了关于封装请求信息方法

2. request操作请求行

格式:请求方式 请求资源 协议/版本

例子:GET /day10 HTTP/1.1

public String getMethod()获取请求方式例如 GET、POST

public String getRequestURI()获取去请求资源(不带参数) 是uri 例如:/day10/r

public String getProtocol()获取协议的名称和版本。(例如 HTTP/1.1)

public String getQueryString()

返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回 null。

例如:

//获取请求方式

String m= request.getMethod();

//获取请求资源

String url=request.getRequestURI();

//获取协议版本

String pro=request.getProtocol();

☆public String getContextPath()获取的是项目名

public StringBuffer getRequestURL() 获取请求的完整路径

重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。

public String getRemoteAddr()获取请求的ip地址

返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 地址

3. request操作请求头

格式:key/value(value可以为多个)

☆public String getHeader(String name) 获取字符串格式的请求头

以 String 的形式返回指定请求头的值。

public java.util.Enumeration<E> getHeaders(String name)获取多个值的请求头

以 String 对象的 Enumeration 的形式返回指定请求头的所有值。

public java.util.Enumeration<E> getHeaderNames()获取所有请求头的名称

返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。

public int getIntHeader(String name) 获取整型格式的请求头

以 int 的形式返回指定请求头的值。如果该请求没有指定名称的头,则此方法返回 -1。如果无法将头转换为整数,则此方法抛出 NumberFormatException。

public long getDateHeader(String name)获取时间类型的请求头

以表示 Date 对象的 long 值的形式返回指定请求头的值

案例:防盗链

Referer

New一个RefererServlet

doGet方法下

//获取referer

String re=request.getHeader(“referer”);

//判断

if(re==null){

System.out.println(“直接在地址栏输入的........”);

}else if(re.startsWith(“http://localhost”)){

System.out.println(“自己点的...........”);

}else{

System.out.println(“其他人点的........”);

}

浏览器内核:user-agent

4. request获取请求参数(只有post有请求体)

Get请求 地址栏

http://localhost:端口/day10/1.html?username=tom&password=1234&hobby=eat&hobby=sleep

Post请求里面放的是?号后面的东西

请求参数是浏览器发送请求时携带的信息。

Get和Post请求的区别:

GET:参数会追加到地址栏上,post不会

请求参数大小有限制(一般不超过1kb),post没有

POST:相对于get请求安全

有请求体,存放请求参数,get没有

dopost方法里面访问doget方法内容

只要在post方法里调用就可以了反之亦然

doget(request,response);

☆public String getParameter(String name)(获取单一的值)

以 String 形式返回请求参数的值,如果该参数不存在,则返回 null

public String[] getParameterValues(String name)(获取多个值)

返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。

☆public java.util .Map<String, String[]> getParameterMap()(以map方式返回的所有的参数和值)

返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。

public java.util.Enumeration<E> getParameterNames()

返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。

New一个Servlet里面doget方法下

例如:

//获取姓名单一

String username= request.getParameter(“uesrname”);

//获取爱好多个

String hobby=request.getParameterValues(“hobby”);

//获取所有参数和值

Map<String,String> map=request.ParameterMap();

//获取所有参数名称

Enumeration<String> names=request.ParamterNames();

System.out.println(“username”);

System.out.println(Arrays.toString(hobby));//打印数组

System.out.println(“----------------------”);

for(String key:map.keySet){

System.out.println(key+:+Array.toString(map.get(key)));

}//map遍历(两种方法)

System.out.println(“----------------------”);

while(names.hasMoreElements()){

System.out.println(name.nextElment());

}

5. request获取参数中文出现乱码

原因:

汉字在不同的编码表中的码值不一样,那么在使用不同的编码表进行解码与编码操作时,就会出现乱码问题.

浏览器在提交的时候使用utf-8编码

Tomcat得到请求参数是使用iso8859-1进行了解码,封装到了request中。

在通过request获取请求信息就是乱码。

解决:

先使用iso8859-1进行编码

在使用utf-8进行解码

每个参数都要new才行(get,post方法都可行)

username= new String(username.getBytes(“iso8859-1”),”utf-8”);

如果请求方式是POST,

可以直接使用request.setCharacterEncoding(“utf-8”);就可以解决。

6. request域对象的介绍

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理.

request

xxxAttribute();

生命周期:一次请求开始,到响应结束之前

setAttribute方法 设置

getAttribute方法 获取

removeAttribute方法 删除

getAttributeNames方法

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,从而共享请求中的数据

request.getRequestDispatcher("内部路径").forward(request,response)

请求转发(请求串,请求链)

请求转发可以实现路径的跳转操作.

实现:

New两个Servlet1 和Srevlet2

一个<a href="/day10/dis1?money=10">i_请求转发_借钱</a><br/> 前段链接加入money属性

Servlet1下

request.getRequestDispatcher("内部路径").forward(request,response)

路径为web.xml配置的跳转的Servlet的路径.

System.out.println("我说:等会");

response.getWriter().print("dis111111111111");

request.setAttribute("name", "世纪");

request.getRequestDispatcher("/dis2").forward(request, response);

Servlet2下

String money=request.getParameter("money");

String name=(String) request.getAttribute("name");

response.getWriter().print("dis2222222222222222");

System.out.println("涛哥哥给你"+money+"块钱,然后我借给"+name);



请求转发和重定向的区别

1.请求转发是服务器内部跳转,地址栏不会发生改变

重定向地址栏会发生改变。

2.请求转发,只有一次请求,一次响应.

重定向,有两次请求,两次响应。

3.请求转发存在request域,可以共享数据.

重定向不存在request域。

4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。

重定向可以访问站外资源,也可以访问站内资源.

5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()

重定向是由response 发起的 response.sendRedirect();

6.请求转发与重定向时路径写法不一样.

重定向要跳转的路径是浏览器在次发起的,是浏览器端路径:写法: /工程名/资源

请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源

7. 请求包含

RequestDispatcher.include()方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能

被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略.include在程序执行上效果类似forward,但是使用forward只有一个程序可以生成响应,include可以由多个程序一同生成响应 ----- 常用来页面布局

New两个html页面分别为 i1.html&i2.html

i1内容1111111111

i2内容22222222222

New一个Servlet get方法下

request.getRequestDispatcher(/i1.html).include(request,response);

request.getRequestDispatcher(/i2.html).include(request,response);

最后在页面输出的内容为111111111122222222222是两个页面的所用内容.

包含原理

四.案例-登录

1.sql用户表创建

CREATE DATABASE day07;

USE day07

CREATE TABLE USER(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(20) ,

PASSWORD VARCHAR(20) ,

email VARCHAR(40)

);

INSERT INTO USER VALUES(NULL,'tom','123','tom@163.com');

INSERT INTO USER VALUES(NULL,'fox','456','fox@163.com');

INSERT INTO USER VALUES(NULL,'james','789','james@163.com');


2.user类


public class User {

private int id;

private String username;

private String password;

private String email;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

@Override

public String toString() {

return "User [id=" + id + ", username=" + username + ", password="

+ password + ", email=" + email + "]";

}

}

3.Jdbc工具类mysql驱动包

4.html表单

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form method="post" action="/day1001/login">

<table>

<tr>

<td>用户名:</td>

<td><input type="text" name="username">

</td>

</tr>

<tr>

<td>密码:</td>

<td><input type="password" name="password">

</td>

</tr>

<tr>

<td colspan='2'><input type="submit">

</td>

</tr>

</table>

</form>

</body>

</html>

5.LoginServlet

package cn.itcast.login;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

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

}

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

//0.设置编码

request.setCharacterEncoding("utf-8");

//1.接受参数 username和password

String username=request.getParameter("username");

String password=request.getParameter("password");

//2.调用useroperation 的login(username,password)登录 返回user

User user=new UserOperation().login(username,password);

//3.将user放入request域中 转发给showServlet

request.setAttribute("user_info", user);

request.getRequestDispatcher("/show").forward(request, response);

}

}

6.userOperation用户操作类 导包是java.sql下的包

package cn.itcast.login;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import cn.itcast.util.JDBCUtils;

/**

* 用户操作类

* @author Administrator

*

*/

public class UserOperation {

/**

* 用户登录操作

* @param username 用户名

* @param password 密码

* @return user

*/

public User login(String username, String password) {

Connection conn=null;

PreparedStatement st=null;

ResultSet rs=null;

try {

//获取链接

conn=JDBCUtils.getConnection();

//编写sql

String sql="select * from user where username = ? and password = ?";

//获取语句执行者

st=conn.prepareStatement(sql);

//设置参数

st.setString(1, username);

st.setString(2, password);

//执行sql

rs=st.executeQuery();

//处理结果

if(rs.next()){

return new User(rs.getInt("id"),rs.getString("username"),rs.getString(3),rs.getString(4));

}

} catch (SQLException e) {

e.printStackTrace();

}finally{

//释放资源

JDBCUtils.closeResource(conn, st, rs);

}

return null;

}

}



7.ShowServlet展示登录信息判断登录条件

package cn.itcast.login;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 展示登录信息

* @author Administrator

*

*/

public class ShowServlet extends HttpServlet {

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

}

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

//0.设置编码

response.setContentType("text/html;charset=utf-8");

PrintWriter w = response.getWriter();

//1.获取域中的user

User user=(User) request.getAttribute("user_info");

//2.判断一下

if(user==null){

//2.1若为空 用户名和密码不匹配 3秒之后跳转到登录页面

w.print("用户名和密码不匹配 ,3秒之后跳转到登录页面!");

//定时刷新

response.setHeader("refresh", "3;url=/day1001/login.html");

}else{

//2.2若不为空 显示欢迎信息 打印

w.print(user.getUsername()+":欢迎回来");

}

}

}

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: