javaweb的概念
javaweb指,所有通过Java语言编写可以通过浏览器访问的程序总称叫做javaweb。
javaweb是基于请求和响应来开发的。
什么是请求?
请求就指客户端给服务器发送数据,叫请求也就是request。
什么是响应?
响应就是指服务器跟客户端回传数据,叫响应也就是responce。
响应和请求的关系
请求和响应是相对应的有请求就有响应!
web资源的分类按实现的技术和呈现的效果不同,又分为静态资源和动态资源两种!
静态资源:html,css,js,MP4,jpg
动态资源:jsp, servlet程序
Tomcat:由Apache组织提供的一种Web服务器,提供对jsp和Servlet的支持。它是一种轻量级的 javaWeb容器(
器),也是当前应用最广的JavaWeb服务器(免费)。
Jboss:是一个遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,它支持所有的JavaEE规范(免费)。
Glassfish:由Oracle公司开发的一款JavaWeb服务器,是一款强健的商业服务器,达到产品级质量(应用很少)。
Resin:是CAUCHO公司的产品,是一个非常流行的服务器,对servlet和JSP提供了良好的支持,
性能也比较优良,resin 自身采用JAVA语言开发(收费,应用比较多)。
WebLogic:是公司的产品,是目前应用最广泛的公司的产品,是目前应用最广泛的服务器,支持JavaEE规范
而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)。
找到tomcat目录下的bin目录下的startup.bat双击启动
怎么测试是否启动成功?
打开浏览器在浏览器的地址栏只输入:
http://localhost:8080/
http://127.0.0.1:8080/
http://真实的本机ip地址:8080/
启动成功会出现一只猫
常见的启动失败的情况有:双击startup.bat文件,就会出现一个小窗口一闪而过
这个时候,失败的原因都是没配置好java_HOME
常见的JAVA_HOME配置的失败的原因的以下的几种情况:
mysql的端口号是3306
tomcat的端口号是8080
找到tomcat下的conf目录,找到service.xml的配置文件
找到标签的port值可以修改的范围1-65535
注意:修改完了端口号记着重启tomcat
平时上百度:www.http://baidu.com:80
http的端口号默认是80,写了也会跟你抹去。
第一种方法:只需要把web工程的目录copy到tomcat下的webapps目录下即可。
怎么访问?
打开网页在地址栏中输入http//:ip:端口号/工程名/访问的页面
第二种配置的方法
本机路径C:\tomcat\apache-tomcat-9.0.17\conf\Catalina\localhost
<!-- Context表示一 个工程上下文
路径表示工程的访问路径:/abc
Docbase表示你的工程目录在哪里
<Context path="/abc"" docBase="E: \book" />
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JffUdqDD-1612409066355)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610680285229.png)]
当我们在浏览器输入如下
http://ip:port/ ========>没有工程名的时候,默认访问的是ROOT工程
当我们在浏览器输入如下
http://ip:port/工程名/ ========>没有资源名默认访问的是indexhtml
路径:File | Settings | Build, Execution, Deployment | Application Servers
配置tomcat安装路径就好了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7E1cC0qC-1612409066360)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610766779907.png)]
什么是servlet的
如何创建servlet程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZljzfVu-1612409066362)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610937970442.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXrexDiy-1612409066365)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610938011005.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CBiRHoJt-1612409066367)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610938094197.png)]
web.xml的配置
<!-- <servlet>给tomcat配置servlet程序 -->
<servlet>
<!-- <servlet-name>给servlet程序起一个别名(一般使用类名)-->
<servlet-name>HelloServlet</servlet-name>
<!-- <servlet-class>是servlet的全类名-->
<servlet-class>com.example.demo.HelloServlet</servlet-class>
</servlet>
<!--<servlet-mapping>给servlet程序设置一个访问地址-->
<servlet-mapping>
<!--<servlet-name>标签的作用是告诉服务器,我当前配置的地址是那个servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--<url-pattern> 标签访问地址-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
注意:/hello必须以/开头约定大于配置
执行原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5OYI3HgL-1612409066370)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610942313286.png)]
怎么区分post请求和get请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo_war_exploded/" method="post">
<button type="submit">提交</button>
</form>
</body>
</html>
看源码知道HttpServletRequest接口继承了ServletRequest
我们需要HttpServletRequest下面的getMethod()方法就可以知道返回类型了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EEEKvwi0-1612409066371)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611024925614.png)]
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("执行了servlet");
/*因为servletRequest的类型是一个ServletRequest类,我们要使用他子类的方法所以就向下转型*/
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
String method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
doGet();
}else if("POST".equals(method)){
post();
}
}
public void doGet(){
System.out.println("get请求");
System.out.println("get请求");
}
public void post(){
System.out.println("psot请求");
System.out.println("psot请求");
}
实际开发中
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget执行了");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost执行了");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Ee5LcZr-1612409066372)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611108936581.png)]
servletConfig类从名字上面看就知道,是servlet程序的配置信息
servletConfig三大作用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
/*获取servlet对象的名称*/
System.out.println("servlet对象的名称是="+servletConfig.getServletName());
/*获取<init-param>里面参数的信息*/
System.out.println("<init-param>里面参数的信息是 ="+servletConfig.getInitParameter("username"));
/*获取servletContext对象*/
System.out.println("servletContext对象="+servletConfig.getServletContext());
}
web.xml里面的配置
<!-- <servlet>给tomcat配置servlet程序 -->
<servlet>
<!-- <servlet-name>给servlet程序起一个别名(一般使用类名)-->
<servlet-name>HelloServlet</servlet-name>
<!-- <servlet-class>是servlet的全类名-->
<servlet-class>com.example.demo.HelloServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICnywQi4-1612409066374)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611110175250.png)]
注意:
getServletConfig()的返回值是ServletConfig类
web.xml
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.example.demo.HelloServlet2</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root2</param-value>
</init-param>
</servlet>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget执行了");
ServletConfig servletConfig=getServletConfig();
/*获取servlet对象的名称*/
System.out.println("servlet对象的名称是="+servletConfig.getServletName());
/*获取<init-param>里面参数的信息*/
System.out.println("<init-param>里面参数的信息是="+servletConfig.getInitParameter("username"));
/*获取servletContext对象*/
System.out.println("servletContext对象="+servletConfig.getServletContext());
}
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2RJxlg3-1612409066375)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611111229447.png)]
如果重写了init方法
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("重写了init方法");
}
其余代码不动
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SE6nb5Hf-1612409066377)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611111427949.png)]
会报一个空指针异常
看源码
GenericServlet类中地方init方法
如果我们重写了他的方法init的内容就会被抹去
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
加上这句代码super.init(config);重写跟父类赋值
getServletConfig();这个方法才能拿到值,
才能正常运行
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("重写了init方法");
}
注意:每一个servlet程序都有一个独立的servletConfig
什么是ServletContext
什么是域对象?
域对象是,可以向map一样存取数据的对象,叫做域对象!
这里的域是存取数据的操作范围,是整个web工程!
Attribute(属性)
存数据 取数据 删除数据
map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()
servletContext类的四个作用
获取 web.xml中配置上下文参数-context-param
首先继承Httpservlet
看源码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9uRLJONX-1612409066378)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\httpservle继承关系.png)]
public class SevrletContext extends HttpServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
ServletContext servletContext = servletConfig.getServletContext();
String username = servletContext.getInitParameter("username");
System.out.println("username的值为"+username);
}
}
获取当前的工程路径,/工程路径
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
ServletContext servletContext = servletConfig.getServletContext();
System.out.println("**获取当前的工程路径,/工程路径**"+servletContext.getContextPath());
}
注意:这里获取的工程路径就是网络上面的网络路径!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WPNdXKE-1612409066379)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611319872868.png)]
获取工程部署后在服务器硬盘上的绝对路径
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
ServletContext servletContext = servletConfig.getServletContext();
System.out.println("获取工程部署后在服务器硬盘上的绝对路径:"+servletContext.getRealPath("/"));
System.out.println("获取工程部署后在服务器硬盘上的绝对路径:"+servletContext.getRealPath("/css/test.css"));
}
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBEXy4Cv-1612409066380)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署原理.png)]
黄色的边框证明了webapp就是demo-1.0-SHAPSHOT
也就是说映射到idea的web目录
这里是本机的tomcat:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ATreo8F5-1612409066381)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署3.png)]
这里是idea帮忙映射的tomcat:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNrueovZ-1612409066381)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署4.png)]
打开xml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R91XWINO-1612409066382)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署5.png)]
C:\Users\34912\IdeaProjects\javaweb\demo\target\demo-1.0-SNAPSHOT打开这地址这就是idea的部署方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i22UnnWN-1612409066383)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署2.png)]
像Map一样存储数据
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
servletContext.setAttribute("username","wmt");
System.out.println("servletContext的值为"+ servletContext.getAttribute("username"));
}
注意:必须存进去才可以取到, ServletContext的生命周期是在web工程重启或者结束时销毁,
什么是http协议
协议是指双方,或多方,相互约定好的,大家都要遵守的规则,叫做协议。
所谓HTTP协议,就是指客户端服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议,
HTTP的协议中的数据叫报文
请求HTTP的协议格式
请求又分为get请求和post请求两种
get请求
1.请求行
1. 请求方式 get
2. 请求资源路径[+?+请求参数]
3. 请求协议的版本号 HTTP/1.1
2.请求头
key:value 组成 不同的键值对,表示不同的含义。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMciYrK5-1612409066384)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611371019366.png)]
post请求
1.请求行
1. 请求方式 post
2. 请求资源路径[+?+请求参数]
3. 请求协议的版本号 HTTP/1.1
2.请求头
key:value 组成 不同的键值对,表示不同的含义。
空行
3.请求体 就是发送 给服务器的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qsvkcEVv-1612409066385)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\post.png)]
get请求有那些
post请求有哪些
form标签 method=post
1.响应行
2.响应头
key:value 不同响应头,有其不同含义
空行
3.响应体
就是回传给客户端的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgMH9l31-1612409066387)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611540816345.png)]
200 表示请求成功
302 表示请求重定向
404 表示服务器收到请求,但是你要的数据不存在(请求地址错误)
500 表示服务器收到请求,但是服务器内部错误(代码错误)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 MIME改善了由RFC 822转变而来的RFC 2822,这些旧标准规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息原本都不能在电子邮件中传输(MIME可以)。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。
MIME类型格式是“大类型/小类型”,并以某一种文件扩展名想对应
用于WAP服务器服务器)的MIME类型有: | |
---|---|
MRP文件(国内普遍的手机) | .mrp application/octet-stream |
IPA文件(IPHONE) | .ipa application/iphone-package-archive |
.deb application/x-debian-package-archive | |
APK文件(安卓系统) | .apk application/vnd.android.package-archive |
CAB文件([Windows Mobile](https://baike.baidu.com/item/Windows Mobile)) | .cab application/vnd.cab-com-archive |
XAP文件([Windows Phone 7](https://baike.baidu.com/item/Windows Phone 7)) | .xap application/x-silverlight-app |
SIS文件(symbian平台/S60V1) | .sis application/vnd.symbian.install-archive *(下有) |
SISX文件(symbian平台/S60V3/V5) | .sisx application/vnd.symbian.epoc/x-sisx-app |
JAR、JAD文件(JAVA平台手机通用格式) | .jar .jad下面有 |
每次只要有请求进入tomcat服务器,tomcat就会把请求过来的HTTP协议信息解析好封装到Request对象中然后传递到service(doGet或者doPost)中给我们使用,我们可以使用HttpServleRequest对象,获取到使有的请求信息
是由tomcat来创建的,使用完了就销毁
getRequestURI 获取相对路径
getRequestURL 获取网络路径
getRemoteHost 获取端口号
getHeader 获取请求头的信息(在里面输什么就获取什么)
getMethod 获取请求的方法
/*getRequestURI() 获取相对路径*/
System.out.println("URI="+req.getRequestURI());
/*getRequestURL() 获取网络路径*/
System.out.println("URL="+req.getRequestURL());
/*IDEA使用127.0.0.1来访问时结果就是127.0.0.1
*IDEA使用localhost来访问结果是127.0.0.1
* IDEA使用端口号访问时结果就是端口号
* */
System.out.println("ip地址="+req.getRemoteHost());
/*获取user-Agent的信息*/
System.out.println("user agent:"+req.getHeader("user-Agent"));
/*获取提交方式*/
System.out.println("请求方式:"+req.getMethod());
Parameter翻译是参数
getParameterValues() 多个参数返回的是数组
getParameter() 一个参数使用这个
1.form表单get请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo2_war_exploded/hello" method="get">
账号:<input type="text" name="username"><p></p>
密码:<input type="password" name="password"><p></p>
c:<input type="checkbox" name="like" value="c">
java:<input type="checkbox" name="like" value="java">
javaee:<input type="checkbox" name="like" value="javaee"><p></p>
<input type="submit">
</form>
</body>
</html>
2.业务层
package com.example.demo2;
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 Servletdemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println(username);
String password = req.getParameter("password");
System.out.println(password);
System.out.println(req.getParameter("like"));
}
}
3.配置服务器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Servletdemo</servlet-name>
<servlet-class>com.example.demo2.Servletdemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
设置语言utf-8就是中文,必须在getParameter方法之前才有效
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------------------doPost-----------------");
/*设置语言utf-8就是中文,必须在getParameter方法之前才有效*/
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
System.out.println(username);
String password = req.getParameter("password");
System.out.println(password);
String[] likes = req.getParameterValues("like");
System.out.println(Arrays.toString(likes));
}
什么是请求转发?
请求转发是指,服务器接收到资源之后从一个资源跳转到另一个资源的操作就叫做请求转发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pe9jpiBr-1612409066388)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611717791734.png)]
public class Servletdemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---------ServletdemodoGet-------------");
String username = req.getParameter("username");
System.out.println(username);
/*把开飞机的舒克保存在key里面*/
req.setAttribute("key","开飞机的舒克");
/*请求转发*/
RequestDispatcher servletdemo2 = req.getRequestDispatcher("/Servletdemo2");
// /*走向哪里*/
servletdemo2.forward(req,resp);
}
}
public class Servletdemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---------Servletdemo2doGet-------------");
String username = req.getParameter("username");
System.out.println(username);
Object key = req.getAttribute("key");
System.out.println(key);
}
}
<servlet>
<servlet-name>Servletdemo</servlet-name>
<servlet-class>com.example.demo2.Servletdemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo</servlet-name>
<url-pattern>/servletdemo</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Servletdemo2</servlet-name>
<servlet-class>com.example.demo2.Servletdemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servletdemo2</servlet-name>
<url-pattern>/Servletdemo2</url-pattern>
</servlet-mapping>
注意:getRequestDispatcher请求转发这个方法写的地址一定要跟web.xml里面的相同注意大小写
注意:…/…/index.jsp这个路径是什么意思,
…/是往上一个路径跳一层,如果上一层路径是http://localhost:8080/demo2_war_exploded/b/c/
得到的路径是http://localhost:8080/demo2_war_exploded/index.jsp
base标签的作用当前网页的跳转的起始参照都以base标签里面的href中的网站为参照
base href=“http://localhost:8080/demo2_war_exploded/b/c/a.html”
注意base标签可以a.html可以省略
public class ForWrodC extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("b/c/a.html").forward(req,resp);
}
<servlet>
<servlet-name>ForWrodC</servlet-name>
<servlet-class>com.example.demo2.ForWrodC</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForWrodC</servlet-name>
<url-pattern>/forWrodC</url-pattern>
</servlet-mapping>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>a</title>
<h1>这里是a</h1>
<base href="http://localhost:8080/demo2_war_exploded/b/c/">
</head>
<body>
<a href="../../index.jsp">首页</a>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<h1><%= "首页" %>
</h1>
<br/>
<a href="b/c/a.html">a标签跳转</a>
<a href="http://localhost:8080/demo2_war_exploded/forWrodC">请求转发</a>
</body>
</html>
在web工程中分为相对路径和绝对路径
相对路径:
. 表示当前目录
… 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
web中/的不同意义
在web中/斜杠也是一种绝对路径
浏览器中
/斜杠 如果在浏览器中解析得到的地址就是http://ip:port/
<a href="/">a标签跳转</a>
服务器中
/斜杠 如果在服务器中解析得到的地址就是http://ip:port/工程路径
在web.xml配置中
<url-pattern>/forWrodC</url-pattern>
web程序中
req.getRequestDispatcher("/").forward(req,resp);
getServletContext().getRealPath("/");
特殊情况: 把斜杠发给浏览器去解析解析出来为:http://ip:port/
resp.sendRedirect("/");
httpservleresquest和httpservletresponse一样,每次请求进来,tocat服务器都会创建一个request对象传递给servlet程序使用,httpservletrequest表示请求过来的信息,httpservletreponse表示响应的信息,我们如果需要设置返回给客户端的信息,都可以通过httpservletresponse对象进行设置。
字节流 getoutputsteam() 常用于下载(传递二进制的数据)
字符流 getwriter() 常用于回传字符串(常用)
两个流只能使用一个,不然要报错
方案一
charset字符集的意思
Encoding编码的意思
/*设置响应的编码格式*/
resp.setCharacterEncoding("UTF-8");
/*因为服务器设置了utf-8但是网页没有设置utf-8所以我们获取请求头*/
resp.setHeader("Content-Type","text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("开飞机的舒克");
方案二
package com.example.demo2;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ServletIO extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*此条代码设置了服务器和浏览器的格式都为utf-8*/
/*注意必须在输入输出流之前设置才有效*/
resp.setContentType("text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("开飞机的舒克");
}
}
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一个新地址让你访问,叫做请求重定向(因为之前的地址可能已经废弃)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0unFxyEV-1612409066389)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1612008759620.png)]
请求重定向的特点:
浏览器地址会发生变化
servlet1如何重定向到servlet2
package com.example.demo2;
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 Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet1已经启动");
resp.setStatus(302);
resp.setHeader("location","http://localhost:8080/demo2_war_exploded/servlet2");
}
}
package com.example.demo2;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("servlet2");
}
}
你访问,叫做请求重定向(因为之前的地址可能已经废弃)。
[外链图片转存中…(img-0unFxyEV-1612409066389)]
请求重定向的特点:
浏览器地址会发生变化
servlet1如何重定向到servlet2
package com.example.demo2;
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 Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet1已经启动");
resp.setStatus(302);
resp.setHeader("location","http://localhost:8080/demo2_war_exploded/servlet2");
}
}
package com.example.demo2;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("servlet2");
}
}