前台:呈现给用户的视觉和基本的操作。
后台:用户浏览网页时,我们看不见的后台数据跑动。后台包括前端,后端。
前端:对应我们写的html 、javascript 等网页语言作用在前端网页。
后端:对应servlet、jsp等技术
Servlet是Java语言中编写Web服务器扩展功能的重要技术,同时它也是JSP技术的底层运行基础。
Servlet是一个基于java技术的Web-APi,运行在服务器端,由servlet容器管理,用于生成动态内容。
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,
由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet
和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java
爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
用于编写servlet的工程叫web工程。
普通工程
java项目通过main作为主函数入口启动,直接依赖JVM就能被编译执行。
普通java工程的话,是AWT,SWING,工具类这类的编码。
普通工程打包后是jar包。
Web工程
java web项目启动依赖web容器,脱离了web服务器就无法启动。web服务器:tomcat
Web工程是网页的编码,像jsp,servlet,struts这类的,也可以理解为j2ee的。
web工程打包后是war包。
Porject/
├── src 存放Java源代码的目录。
├── build 自动编译.java文件的目录
└── WebContent 存放的是需要部署到服务器的文件
├──META-INF 是存放工程自身相关的一些信息,元文件信息,通常由开发工具和环境自动生成。
│ └──MANIFEST.MF 配置清单文件
└──WEB-INF 这个目录下的文件,是不能被客户端直接访问的。
├──lib 用于存放该工程用到的库。
└──web.xml web工程的配置文件,完成用户请求的逻辑名称到真正的servlet类的映射。
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示
格式
protocol://hostname:port/path?parameters
协议 /主机名(ip) :端口/路径?参数key=value&key=value
https://www.baidu.com/s?ie=UTF-8&wd=%E6%9F%90%E5%AE%9D
https://www.taobao.com/?spm=a231o.7712113%2Fg.1581860521.1.2b734608TTXe0n&prepvid=200_11.9.58.175_25659_1573713271728&extra=&pid=mm_10011550_0_0&clk1=&unid=&source_id=&app_pvid=200_11.9.58.175_25659_1573713271728
http://127.0.0.1:8080/project/servlet?name=jason&pwd=123456 get请求
a.继承GenericServlet重写service方法
b.在web.xml配置servlet
servlet名称
servlet处理类
servlet名称
表达式
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
参考 关于HTTP协议,一篇就够了 - ranyonsue - 博客园.png
HTTP之状态码—在浏览器看
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受(请求已经处理完成了)
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现:404:找不到路径,400:坏请求(请求参数错误)405:请求的方式不对
5xx:服务器端错误--服务器未能实现合法的请求:出现了5开头的错误,想都不用想直接打开sts查看异常
Request:请求、Response:响应
ServletRequest封装了请求信息,可以从中获取请求的任何信息
HttpServletRequest是ServletRequest子类,相比ServletRequest更适用Http协议
获得基本信息
String localAddr = request.getLocalAddr();// 获取WEB服务器的IP地址
String localName = request.getLocalName();// 获取WEB服务器的主机名
Integer localPort = request.getLocalPort();// 获取WEB服务器的端口
String remoteAddr = request.getRemoteAddr();// 获取来访者的IP地址
String remoteHost = request.getRemoteHost();// 获取来访者的主机名
Integer remotePort = request.getRemotePort();// 获取来访者的端口
获取请求表单
request.getParameter(arg0)//获取表单
request.getParameterNames()//获取所有表单名字
request.getParameterValues(arg0)//获取表单多个值
request.getParameterMap()//以map形式获取表单
获取地址
request.getRequestURL()
request.getRequestURI()
获取请求类型
request.getMethod()
获取请求头
request.getHeader(arg0)获取请求头
request.getHeaders(arg0);/获取多个请求头的值
getHeaderNames()//获取所有请求头
ServletResponse对象 响应客户端
HttpServletResponse则是对服务器的响应对象。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
常用的方法
addCookie(Cookie cookie) 向客户端写入Cookie
addHeader(Java.lang.String name, java.lang.String value) 写入给定的响应头
encodeURL(java.lang.Stringurl) 默认cookie中包含Session ID,如果客户端不支持 Cookie,就在参数 url 中加入 Session ID 信息,可以解决用户禁用cookie的问题。
setStatus(intsc) 设置响应的状态码
MyFirstServlet.java:
package com.test.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 怎么运行web项目,需要在sts中配置service(web服务)Tomcat
*
* Servlet implementation class MyFirstServlet
*/
@WebServlet("/MyFirstServlet")
public class MyFirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyFirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
*
* 当用户发起请求的时候就会执行doGet和doPosot方法,根据用户的请求方式,使用get请求就调用doget方法,使用post请求就调用dopost方法。
*
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//浏览器地址栏访问的都是get请求。
System.out.println("hello,我的第一个servlet,doget方法");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("hello,我的第一个servlet,dopost方法");
}
}
MySecondServlet.java:
package com.test.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
/**
*
* 在servlet3.0之前是没有注解方式的,只能通过web.xml来进行配置
*
* 在servlet3.0之后就是可以通过使用注解方式@WebServlet("/MyFirstServlet") MyFirstServlet就是访问地址
*
* 在同一个servlet中配置方式和注解方式不要一起使用
*
* @author admin
*
*/
public class MySecondServlet extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
//抽象类,需要重写service方法。
//service就是doGet和doPost方法的上一级
//简单一点:所有访问MySecondServlet的请求都会执行service方法
System.out.println("我的第二个servlet!!");
System.out.println(1/0);
}
}
MyServlet3.java:
package com.test.servlet;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class MyServlet3 extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// request请求
// response相应
// 获得基本信息
String localAddr = request.getLocalAddr();// 获取WEB服务器的IP地址
String localName = request.getLocalName();// 获取WEB服务器的主机名
Integer localPort = request.getLocalPort();// 获取WEB服务器的端口
String remoteAddr = request.getRemoteAddr();// 获取来访者的IP地址
String remoteHost = request.getRemoteHost();// 获取来访者的主机名
Integer remotePort = request.getRemotePort();// 获取来访者的端口
// 快捷键就是多行编辑:进入刀快捷键状态alt + shift + a,退出也是alt + shift + a
System.out.println(localAddr);
System.out.println(localName);
System.out.println(localPort);
System.out.println(remoteAddr);
System.out.println(remoteHost);
System.out.println(remotePort);
// 表单信息就是在请求的时候携带的参数
// get请求就是在url?后面的参数,表单就是key=value形式,多个表单参数隔开使用
// http://localhost:8080/day43/MyServlet3?aaa=123&bbb=456
// post请求表单是隐藏的
// 获取请求表单
// request.getParameter(arg0)//获取表单
// request.getParameterNames()//获取所有表单名字
// request.getParameterValues(arg0)//获取表单多个值
// request.getParameterMap()//以map形式获取表单
String aaa = request.getParameter("aaa");
String bbb = request.getParameter("bbb");
System.out.println(aaa);
System.out.println(bbb);
Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String string = (String) enumeration.nextElement();
System.out.println(string);
}
System.out.println("---------------------getParameterValues----");
// http://localhost:8080/day43/MyServlet3?aaa=a1&bbb=b2&aaa=c3&aaa=d4
String[] strings = request.getParameterValues("aaa");
for (String string : strings) {
System.out.println(string);
}
System.out.println("---------------------getParameterMap----");
Map<String, String[]> map = request.getParameterMap();
for (String string : map.keySet()) {
System.out.println(string);
String[] strings2 = map.get(string);
for (String string3 : strings2) {
System.out.println(string3);
}
}
// 获取地址 获取url
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
StringBuffer url = httpServletRequest.getRequestURL();
// 标识符
String url2 = httpServletRequest.getRequestURI();
System.out.println(url.toString());
System.out.println(url2);
// 获取请求类型
// request.getMethod()
System.out.println(httpServletRequest.getMethod());
System.out.println("---------------------getHeaderNames----");
// 获取请求头
// request.getHeader(arg0)获取请求头
// request.getHeaders(arg0);/获取多个请求头的值
// getHeaderNames()//获取所有请求头
Enumeration<String> enumeration2 = httpServletRequest.getHeaderNames();
while (enumeration2.hasMoreElements()) {
String string = (String) enumeration2.nextElement();
System.out.print(string + ":");
// 根据key获取值
System.out.println(httpServletRequest.getHeader(string));
}
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>day43</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置servlet、firter、listener等等 -->
<!--servlet信息 -->
<servlet>
<servlet-name>MySecondServlet</servlet-name>
<servlet-class>com.test.servlet.MySecondServlet</servlet-class>
</servlet>
<!--servlet映射 -->
<servlet-mapping>
<servlet-name>MySecondServlet</servlet-name>
<url-pattern>/aaa</url-pattern><!-- 访问地址,访问aaa,就要访问com.test.servlet.MySecondServlet中service方法 -->
</servlet-mapping>
<!-- 在web项目中只有一个web.xml。文件,servlet有多个就配置多个 -->
<!-- 配置servlet、firter、listener等等 -->
<!--servlet信息 -->
<servlet>
<servlet-name>MyServlet3</servlet-name>
<servlet-class>com.test.servlet.MyServlet3</servlet-class>
</servlet>
<!--servlet映射 -->
<servlet-mapping>
<servlet-name>MyServlet3</servlet-name>
<url-pattern>/MyServlet3</url-pattern><!-- 访问地址,访问aaa,就要访问com.test.servlet.MySecondServlet中service方法 -->
</servlet-mapping>
<servlet>
<servlet-name>ServletHw</servlet-name>
<servlet-class>com.test.servlet.ServletHw</servlet-class>
</servlet>
<!--servlet映射 -->
<servlet-mapping>
<servlet-name>ServletHw</servlet-name>
<url-pattern>/ServletHw</url-pattern><!-- 访问地址,访问aaa,就要访问com.test.servlet.MySecondServlet中service方法 -->
</servlet-mapping>
</web-app>