静态资源和动态资源联系起来
静态资源(前端人员开发的页面)—发送请求—>动态资源(java开发的后台程序)
比如:login.html—>发送登录请求—>java程序,实现登录功能
实现方式有两种:
方式一:login.html—>发送同步请求—>java程序
方式二:login.html—>发送同步请求—>java程序
服务器:
问题:用户—>通过网络—>(静态资源—>动态资源)
访问方式:
1.用户打开浏览器
2.在浏览器地址栏:输入访问资源地址
3.资源数据会展示到浏览器给用户看
web资源和服务器的关系
输入访问资源地址后,去哪里找资源,资源在哪里保存?
资源在服务器存放
上述的整个流程
浏览器—>访问地址—>服务器—>要访问的资源
服务器的分类:
1.硬件服务器,指配置较高的主机
比如:IBM刀片式服务器,思科服务器,华为服务器等等~~
2.软件服务器:指的是我们的应用程序
比如:mysql数据库服务器,mysql就是一款数据库软件
DB2数据库服务器,它是IBM的数据库产品
结论:通常所说的服务器,指的是应用软件安装在配置比较高的主机,称之为服务器,是硬件和软件的结合!
访问web资源
访问流程:浏览器—>输入访问地址—>服务器—>资源
比如:搭建脚手架,构建vue项目.启动项目,
访问地址:http://localhost:8080/index.html
网络访问三要素
1.http(https)协议:规范浏览器和服务器传输数据的格式
浏览器—>服务端资源 请求过程 : 浏览器提交请求数据,需要遵循http协议
服务器—>浏览器 响应过程 : 服务器响应数据到浏览器,需要遵循http协议
2.域名(domain)
域名是服务器的唯一标识,因为域名的本质是IP地址,在网络中,IP地址是唯一的.
浏览器访问服务器资源,首先要找到服务器,根据域名(IP地址)找到服务器
3.端口(port)
什么是端口? —>端口其实就是一个整数
端口有什么作用? —> 端口是用来区分硬件服务器上面相同的多个软件服务器
总结:
1.web资源(静态资源,动态资源)
2.访问web资源,把web资源放到服务器上面
3.服务器:硬件服务器,软件服务器,软件安装到硬件
4.访问服务器端资源:
http://域名(ip):port/资源
5.网络三要素:http(https)协议,域名(domain),端口(port)
Tomcat
Tomcat官网网址:https://tomcat.apache.org
web服务器产品
weblogic:大型商用服务器,Oracle
webSphere:大型商用服务器,IBM
Tomcat:开源,免费
推荐下载8,9,10版本
注意Tomcat和jdk版本的兼容性
安装tomcat
进tomcat的安装路径下的目录:
bin:binary,二进制目录,startup.bat,shutdown.bat
conf:configuration,配置目录,存放的配置文件,server.xml,web.xml
lib:library,存放jar包,tomcat是java语言开发软件
logs:日志目录,tomcat运行产生的日志文件,存放在这个目录里面
tem:临时目录,tomcat运行产生的临时文件,存放在这个目录
webapps:存放web资源:可以是静态资源,也可以是动态资源
步骤一:启动tomcat(tomcat目录bin目录下的startup.bat)
步骤二:浏览器输入:http://localhost:8080
如何部署资源到tomcat服务器,然后进行访问
步骤一:将静态资源项目放到tomcat/webapps目录下
步骤二:启动tomcat服务器
步骤三:访问tomcat服务器资源
方式一:只能自己访问自己的tomcat
http://localhost:8080/静态资源项目名称
访问二:dos命令ipconfig/all,找以太网ipv4
http://ip:8080/静态资源项目名称
一个主机可能安装多个tomcat,端口被 占用.
解决方案:
方式一:tomcat/conf/server.xml文件,修改端口
方式二:在idea里面修改tomcat端口
idea整合tomcat
idea–>Run—>Edit Configurations,把tomcat的安装路径加进去~
整合时,在idea里面找不到tomcat
原因是idea的版本问题
idea社区版本community versiion:找不到tomcat
idea创建web动态资源项目(注意:web-INF目录下不能放任何css文件,html文件,js文件,图片等资源)
1.创建web动态资源项目
2.部署动态资源项目到tomcat
3.访问http://域名或者ip:port/项目名称/资源
常见问题:404,路径写错了~~
web-INF目录下不能放任何css文件,html文件,js文件,图片等资源,web-INF目录是安全目录,不能被浏览器访问~~
Servlet概述
servlet是运行在web服务器中的小型java程序(动态资源).servlet通常通过HTTP(超文本传输协议)接收和响应来自web客户端(浏览器)的请求
servlet作用
1.servlet接收浏览器发送的请求,接收请求数据
2.servlet对请求处理,然后响应数据给浏览器
Servlet入门
servlet是sun制定的动态资源程序标准,提供的是一个servlet接口.
我们程序员开发servlet,自定义一个类去实现servlet接口,重写里面方法
servlet入门程序
步骤一:IDEA创建一个web项目,比如web02
步骤二:项目的src目录,创建一个包(new packge),比如:cn.tedu.web
步骤三:在包下面,自定义一个类,比如:DemoServlet实现Servlet接口,重写接口里面的方法
步骤四:在自定义的类里面配置访问路径,比如:“/demo1”
步骤五:测试
浏览器地址栏:http://localhost:端口号/项目名称/servlet访问路径
问题一:实现Servlet接口,并且Servlet接口报红色
不能导入包import javax.servlet包,是idea的版本问题,找到tomcat安装目录下lib目录,找到servlet-api.jar包
问题一解决方案:
方案一:在web项目中,导入servlet-api.jar
在WEB-INF目录下面,创建一个lib目录(如果有,就不用),把servlet-api.jar放到lib目录里面,同时把servlet-api.jar加载到项目中
方案二:在web项目中,引入tomcat开发环境(tomcat自带servlet-api.jar),右击项目Project Structure—>Dependencies—> + —>library,添加Tomcat.
package cn.tedu.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/**入门案例*/
@WebServlet(urlPatterns = "/demo1")
public class Demo1Servlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* @param servletRequest
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse response) throws ServletException, IOException {
System.out.println("hello request!");
//1.打印模拟:接收请求了
System.out.println("接收浏览器的请求");
//2.响应数据到浏览器,先英文,不要写中文,中文会乱码
PrintWriter writer = response.getWriter();
writer.write("hello response!!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
servlet访问流程
要求:需要创建一个web项目,把部署到服务器,通过浏览器去访问servlet资源
在浏览器地址栏输入的servlet访问路径(http://localhost:端口号/项目名称/servlet访问路径)
地址一: 输入 http://域名:端口
作用:访问到主机上安装的tomcat服务器
地址二: /项目名称
作用:访 问的tomcat服务器部署的项目
地址三: /servlet访问路径
作用:访问tomcat服务器部署的项目里面的servlet资源
servlet生命周期
生命周期:指对象从创建到销毁的完整过程,这个过程就是生命周期
在完整的过程中,涉及到方法的执行,那么这些方法,我们称之为生命周期方法
package cn.tedu.web;
import javax.servlet.*;
import java.io.IOException;
/**
*生命周相关的方法,一共三个
* init(参数):当servlet对象创建以后,执行该方法
* service(参数):当浏览器发送请求时,执行该方法
* destroy():当销毁servlet对象以后,执行该方法
* 问题一:servlet对象创建好以后,在哪里保存?
* servlet是运行在tomcat服务器上面,
* 保存在tomcat服务器的内存中
* 问题二:servlet对象会创建几次呢?
* servlet只创建一次,与创建对象相关的init()方法,执行一次
* 问题三:生命周期方法什么时候执行,执行几次?
* init(参数):只执行一次,当第一次访问时才会执行
* service(参数):执行多次,每次访问都会执行
* destroy():只执行一次,当服务器正常关闭时才会执行
*/
public class Demo2Servlet implements Servlet {
/**
* 生命周期方法:创建servlet对象,执行init()方法
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
/*
获取servletConfig配置类对象,了解即可
*/
return null;
}
/**
* 生命周期方法:作用接收浏览器请求,响应数据给浏览器
* @param servletRequest:请求对象,处理请求数据
* @param servletResponse:响应对象,处理响应数据
* @throws ServletException:异常信息对象
* @throws IOException:异常信息对象
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
/*
获取servlet的信息, 了解即可,实际开发中基本用不上
比如:servlet的访问路径,servlet的名称
*/
return null;
}
/**
* 生命周期方法:在servlet对象销毁以后,执行该方法
*/
@Override
public void destroy() {
}
}
Servlet的体系结构
顶层接口
servlet里面都是抽象方法
抽象子类,实现servlet接口
GenericServlet里面有抽象方法,也有普通方法
抽象子类,继承了GenericServlet
HttpServlet里面有抽象方法,也有普通方法
为什么设计Servlet体系结构,这样设计?
方式1.如果开发者定义一个类,实现Servlet接口,这种方式不好
缺点:自定义类重写接口的所有方法,即使方法不需要,也要全部重写
方式2.如果开发者定义一个类,继承GenericServlet,这种方式也不好
优点是:解决了实现Servlet接口全部重写方法的缺点
缺点:不能明确指定浏览器发送的是什么请求,以及不能处理请求的数据
方式3.如果开发者定义一个类,继承HttpServlet,这种方式好
解决了上面1,2中存在的问题,明确指定浏览器发送的是http请求,处理请求数据
http协议:作用是规范请求和响应过程的数据交互格式
结论:实际的企业开发中,通过继承HttpServlet来定义我们的类,处理请求和响应数据
实际开发中,Servlet推荐的书写方式
自定义一个类,继承HttpServlet,重写下面两个方法(重点以及难点)
1.doGet(请求对象 request,响应对象 response)
作用:接收浏览器发送的get请求
2.doPost(请求对象 request,响应对象 response)
作用:接收浏览器发送的post请求
package cn.tedu.web;
import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 方式一:重写service方法
* 快捷方式:如何重写service方法
*
* 总结:
* service方法:get请求能接收,post也能接收,存在很多问题?
* get请求提交中文时,处理方式是一种方式
* post请求提交中文时,处理方式是另一种方式
* get请求和post请求提交中文时,处理方式是不一样的
* 在service方法内部怎么判断?
* 不好判断浏览器发送的是get请求还是post请求
* 那么不好处理get请求和post请求的代码
* 结论:
* 在实际开发中,继承HttpServlet,不重写service方法,而是重写doGet和doPost
* 浏览器发送get请求-------->doGet方法内部:处理get请求的中文问题
* 浏览器发送post请求------->doPost方法内部:处理post请求中文的问题
*/
//@WebServlet(urlPatterns = {"/demo4","/demo3"})
@WebServlet(urlPatterns = "/demo4")
public class Demo4Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("browser 请求 ");
resp.getWriter().write("hello service~~");
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 只有form的method=post才能发送post请求,其它的都是get请求 -->
<a href="demo4">get请法就的方式访问</a>
<hr/>
<form action="demo4" method="get">
<input type="submit" value="get方式提交"/>
</form>
<hr/>
<form action="demo4" method="post">
<input type="submit" value="post方式提交"/>
</form>
</body>
</html>
为什么不重写service方法,而重写doGet和doPost方法(重点以及难点)
结论就是:service方法内部,不知道浏览器发送的是get请求还是post请求,都会接收,最终在处理get请求
的数据时和处理post请求的数据时,处理方式不一样,所以不重写service方法
HttpServlet中的service方法和doGet方法和doPost方法有关系吗?
答案肯定有.
什么关系,查询HttpServlet的源代码
快捷方式有两种:
方式一:在代码中,找到HttpServlet,安装ctrl键,鼠标点击
方式二:在当前项目中,crtl+n快捷键,在它的输入框:HttpServlet
源码分析:
浏览器发送的get请求—>HttpServlet中的service方法:
1.获取浏览器的提交请求方式:method
2.if判断(method.equals(“Get”)){
//this指代的就是当前HttpServlet
this.doGet(req,response);
}else if(method.q)
浏览器发送请求时---->service方法:根据请求方式的不同,去调用doGet或者doPost方法
结论1:(请求方式一共7种,常见的有两种Get和Post)
结论2:浏览器发送请求时---->service方法:根据请求方式的不同---->去调用doGet或者doPost方法
结论3:
浏览器发送get请求----------->doGet方法
浏览器发送post请求----------->doPost方法
常见的问题:
1.404问题:表示请求路径找不到,因为路径写错了
2.500问题:表示代码出异常了,检查代码问题
3.405问题:表示请求方式不支持
浏览器发送get请求-------->后台java代码只有一个doPost方法
浏览器发送post请求-------->后台java代码只有一个doGet方法
Servlet回顾
1.servlet是一个java程序(动态资源),运行在web服务器端
2.接收浏览器请求,获取浏览器提交的请求数据
浏览器-------------->服务器端
3.响应数据给浏览器(servlet里面的response)
浏览器----------->服务器端
servlet体系结构
顶层接口:Servlet
抽象类:GenericServlet
抽象类:HttpServlet
关系:HttpServlet—>GenericServlet—>Servlet
结论:
1.在开发时,自定义servlet有三种方式
2.浏览器发送的是http请求,推荐使用HttpServlet
HttpServlet
源码分析:HttpServlet的service方法内部的思路
1.获取浏览器的请求方式
2.根据请求方式的不同,去执行对应的doGet(req,resp)和doPost(req,resp)
//1.获邓请求方式:request请求对象,当然获取请求数据
String method=request.getMethod();
//2.if判断:请求方式=="get"
if(method.equals("Get")){
this.doGet(request,response)
}else if(method.equals("Post")){
this.doPost(request,response)
}
结论:
继承HttpServlet以后,重写doGet和doPost方法
请求对象
请求过程:从浏览器到服务器的过程,称之为请求过程
浏览器----------------请求过程:提交请求数据------------------------>服务器端
请求数据:使用请求对象request来处理
请求对象的类型(引用类型):HttpServletRequest
请求对象常用方法:
第一类:获取请求数据
方法名称 | 作用 |
---|---|
getParameter(“name属性”) | 获取单个输入框的值 |
getParameterValues(“name属性的值”) | 获取复选框的值 |
getParameterMap() | 获取的表单里面的所有数据 |
单个获取输入框的值:
package com.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
/**
* 1.定义类ParamServlet继承HttpServlet的方式
* 作用:获取浏览器提交的数据,以及响应数据给浏览器
* 2.doGet方法:request,response
*request请求对象:获取请求数据的
* response响应数据:响应数据到浏览器的
* 3.doPost方法:request,response
* request请求对象:获取请求数据的
* response响应数据:响应数据到浏览器的
*/
@WebServlet(urlPatterns = "/paramServlet")//注意路径必须加/,不加的,tomcat启动就报错
public class ParamServlet extends HttpServlet {
/**
* 作用:接收浏览器发送的get
* @param request:获取请求数据,浏览器--->服务器
* @param response:响应请求数据,服务器--->浏览器
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.根据name的属性获取用户输入的用户名
//因为name="username"是写死的,但是用户名可以随意输入
String userValue = request.getParameter("username");
System.out.println("请求的用户名是:"+userValue);
//2.获取密码
String psw = request.getParameter("psw");
System.out.println("请求的密码是:"+psw);
//3.love多个值
String[] loves = request.getParameterValues("love");
System.out.println("爱好:"+ Arrays.toString(loves));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>request parameter page</title>
</head>
<body>
<!--
form表单的方式提交数据
http协议提交数据时:key=value的形式
所以form中的输入项必须有name属性
-->
<form action="paramServlet" method="get">
用户名:<input type="text" name="username" />
<br/>
密 码:<input type="password" name="psw" />
<br/>
爱好:<input type="checkbox" name="love" value="comment"/>爱评论
爱好:<input type="checkbox" name="love" value="study"/>爱学习
爱好:<input type="checkbox" name="love" value="salary"/>拿高薪
<input type="submit" value="提交数据"></input>
</form>
</body>
</html>
一次性获取所有的输入框的值存入Map集合:
package com.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
@WebServlet(urlPatterns = "/ParamMapServlet")
public class ParamMapServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取表单提交的所有数据
Map<String, String[]> map = req.getParameterMap();
//2.遍历map
//2.1获取所有的key
Set<String> keys = map.keySet();
//2.2遍历set:快捷键iter:增强for循环~
for (String key : keys) {
String[] value = map.get(key);
System.out.println(key + ":" + Arrays.toString(value));
}
}
}
第二类:处理请求中文乱码问题
为什么会出现请求中文的乱码问题?
浏览器提交的中文数据的编码格式------->tomcat服务器的编码格式不一样
常见的编码格式,推荐使用UTF-8
1.支持中文的编码格式:GBK
特点:支持中文,也支持英文,不支持日文,韩文等等
2.万能的编码格式:utf-8(UTF-8)
特点:支持所有字符,比如中文,韩文,日文等等
3.西欧编码:ISO8859-1
特点:只支持欧美国家的字符集,不支持中文,韩文,日文等等
解决乱码:请求方式不一样,提交的请求数据的形式不一样,所以根据不同的请求方式来处理乱码
1.get请求的中文乱码问题:
tomcat8版本以上,自动处理了get请求的中文乱码问题.
tomcat8版本以下,自行写代码处理get请求的中文乱码问题
//tomcat8以下版本处理中文乱码问题
String vule = new String("用户数据".getBytes("iso8859-1"),"utf-8");
2.post请求的中文乱码问题:
//注意:上面的代码必须放在方法的第一行
request.setCharacterEncoding("utf-8");
=================================================
响应对象HttpServletResponse
响应过程:从服务器到浏览器响应数据的过程,就是响应过程
web服务器----------------------响应:响应数据-------------------------------->浏览器
作用:主要处理响应数据以及重定向
类型(引用类型):HttpServletResponse
- 第一类方法:响应数据方法(服务器-----响应数据:与浏览器绑定的输出流—>浏览器)
字符输出流的方式:
PrintWriter out = response.getWriter();
out.write(“字符串数据”);
package cn.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/Demo1")
public class Demo1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.字符输出流的方式,响应数据到浏览器
//1.1获取字符输出流
PrintWriter out = resp.getWriter();
//1.2写方法或者打印方法,响应数据
out.write("hello response!!!");
//1.3关闭流:原则 倒关
out.close();
}
}
字节输出流的方式
package cn.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
/**
* 注解中:
* value特权属性:当注解中,有且只有一个value属性时
* value可以省略不写
*/
@WebServlet(urlPatterns = "/Demo2")
public class Demo2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//字节输出流响应数据
//1.获取字节输出流对象
//OutputStream out1 = response.getOutputStream();//多态写法
ServletOutputStream out2 = response.getOutputStream();
//2.写方法,响应数据
String str = "hello 1111";//字符串
byte[] bytes = str.getBytes();//把字符串转换为字节符
out2.write(bytes);//字节符作为参数传进字节输出流的write方法作为参数
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
- 第二类方法:处理响应中文数据的乱码问题
处理字符流响应数据乱码问题
//必须放在方法的第一行才能解决中文乱码问题
//服务器向浏览器响应文本数据,文本的编码格式是utf-8
response.setContentType("text/html;charset=utf-8");
//服务器向浏览器响应的json数据,json数据编码格式是utf-8
response.setContentType("application/json;charset=utf-8");
/*text/html(固定写法):字符输出流向浏览器响应的文本或者html网页数据
application/json(固定写法,不唯一):字符输出流向浏览器响应的json数据
charset=utf-8*/
字符流的处理乱码示例(一步完成):
package cn.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/Demo1ServletEncoding")
public class Demo1ServletEncoding extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
字符流响应处理乱码问题一步完成
设置响应对象的编码问题: resp.setContentType("text/html;charset=utf-8");
*/
//response.setContentType("text/html;charset=utf-8");
response.setContentType("application/json;charset=utf-8");
//1.处理响应中文的乱码问题
//字符输出流
response.getWriter().write("hello 字符流");
}
}
字节流的处理乱码示例(两步完成):
package cn.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/Demo2ServletEncode")
public class Demo2ServletEncode extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
字节流响应处理乱码问题两步
1.设置响应对象的编码问题: resp.setContentType("text/html;charset=utf-8");
2.设置字节流的编码格式:byte[] bytes = str.getBytes("utf-8");
*/
//1.处理字节流的中文乱码问题
resp.setContentType("text/html;charset=utf-8");
//2.获取字节输出流,响应中文数据
String str = "hello 字节流中言语";
byte[] bytes = str.getBytes("utf-8");//设置字节流的编码格式
//响应到浏览器
resp.getOutputStream().write(bytes);
}
}
- 第三类方法:重定向
重定向:从一个资源跳转到另一个资源(比如:类似点击超链接跳转)
- 方法
response.sendRedirect(“路径”);
路径书写:绝对路径的书写方法
综合案例
案例:企业级项目用户管理平台,实现登录功能
-
步骤1:创建一个web项目:UserSystem(usermanagerment)
-
步骤2:在web目录下面,创建一个登录页面login.html
-
步骤三:创建一个LoginServlet处理登录请求
登录页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div style="text-align: center">
<form action="LoginServlet" method="post">
用户名:<input type="text" name="username"/><br/>
密 码:<input type="password" name="psw"/><br/>
<input type="submit" value="登录"/>
</form>
</div>
</body>
</html>
登录成功:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎您:访问我的网页</h1>
</body>
</html>
Servlet业务处理页面:
package cn.tedu.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 实现登录功能:获取用户输入的用户名和密码,判断是否正确
*/
@WebServlet(urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.处理请求中文的乱码问题
request.setCharacterEncoding("utf-8");
//2.处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
//3.获取用户输入的数据:用户名和密码
String username = request.getParameter("username");//获取用户名
String password = request.getParameter("psw");//获取密码
//4.进行判断
//4.1 如果用户名=admin,密码=111,表示登录成功
if(username.equalsIgnoreCase("admin")&&password.equals("111")){
//成功以后,跳转到主页面,使用重定向
String url = "http://localhost:8888/UserSystem/main.html";
response.sendRedirect(url);
}else{
//4.2 不正确,表示登录失败,让用户重新登录,显示登录链接
String url = "http://localhost:8888/UserSystem/login.html";
String info = "用户名密码有误!请重新输入!!!";
info+="<br/>";//第一层拼接
info+="<a href='"+url+"'>去登录</a>";
response.getWriter().println(info);
//response.getWriter().println("用户名密码有误!请重新输入!!!");
// response.getWriter().println(info+"<br/>"+"<a href='"+url+"' >去登录</a>");
}
}
}
总结:
login.html------------->
LoginServlet判断:用户名和密码正确,重定向到main.html
Filter过滤器(理解即可)
- Filter概述
过滤器是web开发的三大组件之一,它的主要作用是对浏览器访问资源进行拦截和放行
拦截:浏览器访问资源时----------->Filter拦截------------->服务器的资源
放行:在过滤器里面进行判断,如果是合理请求,就放行,如果是非法请求,就拦截
实际开发中:
浏览器---------------------->Filter1-------------->Filter2------------------->服务器
1.浏览器访问服务器的资源时,经过多个过滤器
2.浏览器向服务器发送请求,请求过程,过滤器拦截
3.服务器向浏览器响应数据,响应过程,过滤器拦截
-
企业级开发,过滤器的场景
1.全局的post请求的中文乱码处理(案例)
2.进行敏感词汇过滤(案滤):浏览器-------Filter:评论内容过滤---------->服务器保存
3.进行权根校验:浏览器------Filter:判断用户有没有权限------服务器资源
-
Filter的拦截路径配置
1.直接配置拦截资源名称
比如:/home.html,只拦截home.html
2.扩展名拦截资源配置:*.html
女如:*.html,拦截所有后缀名为html的资源
3.通配符拦截资源配置:/*
比如:/*,拦截所有资源, *匹配所有资源
- 过滤器链
指在开发中配置了多个过滤器,多个过滤器构成链
过滤器的执行顺序
浏览器------>filter1-----------filter2--------->服务端资源
- 注意
每个过滤器配置的拦截路径一定一样,才会形成过滤器链