web应用程序是可以提供浏览器访问的程序
服务器是一种被动的操作,用来处理用户放入一些请求和给用户一些响应信息;
配置启动的端口号:默认8080
mysql默认:3306
http默认: 80
https默认: 443
配置主机名称:loaclhost–>127.0.0.1
默认网站应用存放位置为:webapps
--Root
--THHH:网站的目录名
--WEB-INF
-classes:java程序员
-lib:web应用所依赖的包
-web.xml
--indes.html 默认首页
-static
-css
-js
-img
--.......
HTTP(超文本传输协议)是一个简单的请求-相应协议,它通常运行在TCP之上
`Request URL:https://www.baidu.com/ 请求地址
Request Method :GET get和post`方法
status Code :200 ok 状态码:200
Accept: 告诉浏览器,支持的数据格式
Accept-Encoding: 支持的编码格式:CBK UTF-8 吗 CB2312
Accept-Language : 告诉浏览器它的语言环境
cache_COntrol:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持
HOST:主机........../
Cache-Control:private 缓存控制
Connection:Keep-Alive 保持连接
Content-Encoding:gzip
Content-Type:text/html 编码类型
Accept: 告诉浏览器,支持的数据格式
Accept-Encoding: 支持的编码格式:CBK UTF-8 吗 CB2312
Accept-Language : 告诉浏览器它的语言环境
cache_COntrol:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持
HOST:主机........../
Refresh:告诉浏览器刷新频率
Location:让网页重新的定位:
2xx:如202,响应成功
3xx:请求重定向
4xx:如404、找不到制定资源
5xx:服务器代码错误,如502,网关错误
alimaven
central
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
配置一个本地仓库:
<localRepository>D:\develop\apache-maven-3.6.1\repository</localRepository>
资源导出问题:由于约定大于配置 ,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题
注释:为什么需要映射:java程序通过浏览器访问,二浏览器需要连接web服务器,所以我们需要在web服务器中注册java写的Servlet,相当于给浏览器一个能访问的逻辑
<!--注册Servlet-->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.thhh.servelt.HelloServlet</servlet-class>
</servlet>
<!--Servlet请求路径-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
<!--前端输入的请求-->
</servlet-mapping>
public class HelloServlet extends HttpServlet {
//由于get和post都是实现请求的不同方式,可以互相调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream=resp.getOutputStream(); 输出流
PrintWriter writer=resp.getWriter();//响应流:输出数据到页面
writer.println("Hello,Servlet" );
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Url模式有三种:
规则:
1.容器会对路径进行完全匹配,找到成功匹配为止
2.容器会递归地尝试匹配最长的路径前缀。这是一次向下路径树的目录,使用“/”字符作为路径分隔符。最长的匹配决定选定的servlet
3.假于路径有后缀,容器会匹配指定后缀的servlet去处理
4.以上三点都没符合的,当有默认的servlet,会被调用
注意:
1、拦截*.do,例如:/user/add.do,弊端:所有的url都要以.do结尾。不会影响访问静态文件。
2、拦截/app/*,例如:/app/user/add,弊端:请求的url都要包含/app。
3、拦截/,例如:/user/add,弊端:对jpg,js,css静态文件的访问也被拦截不能正常显示。
4、拦截/*,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。
web容器在启动的时候,它会为每个web程序创建一个对应的ServletCOntext对象,它相当于代表了当前的web应用:
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext contxext = this.getServletContext();
String username = "thhhh";
contxext.setAttribute ("username",username);//讲一个数据保存在了ServletContext中,名字为:username,值:username
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username= (String) context.getAttribute("username");
resp.setContentType("text/html");
//设置文本属性
resp.setCharacterEncoding("utf-8");
//设置编码类型
resp.getWriter().println("田晗:"+username);
//响应流
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了Dispatcher");
context.getRequestDispatcher("//gp").forward(req,resp);
}//在浏览器上请求Dispetchar,转发到路径/gp上的资源
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
//可能导致字符串丢失
负责向浏览器发送响应头的方法
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
响应的状态码
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取下载的文件路径
String realPath = "F:\\IdeaProject\\practive_mvn01\\response\\target\\classes\\2.png";
System.out.println("下载文件的路径:"+ realPath);
//2、下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3、设置浏览器能够支持下载
resp.setHeader("Content-Disposition","attachment;fileName = "+fileName);
//4、获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5、创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6、获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
//7、将FileOutputStream流写入到Buffer缓冲区
while((len=in.read(buffer)) > 0){
out.write(buffer,0,len);
}
in.close();
out.close();
//8、使用OutputStream将缓冲区中的数据输出到客户端
}
验证码怎么来
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒自动刷新一次
resp.setHeader("refresh", "3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
//得到图片
Graphics2D g = (Graphics2D) image.getGraphics();
//设置图片颜色
g.setColor(Color.white);
g.fillRect(0, 0, 80, 20);
//给图片写数据
g.setColor(Color.BLUE);
g.setFont(new Font(null, Font.BOLD, 20));
g.drawString(makeNum(), 0, 20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("exprise", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Prarga", "no-cache");
//吧图片写给浏览器
ImageIO.write(image, "jpg", resp.getOutputStream());
}
//生成随机数
private String makeNum() {
Random random = new Random();
String num = random.nextInt(999999) + " ";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 6 - num.length(); i++) {
sb.append("0");
//随机生成的数不够6位,就用0填充
}
return sb.toString() + num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
一个web的资源收到客户端请求后,它会通知客户端去访问另外一个web资源
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/file/image");
}
重定向和转发的区别:
相同点:
不同点:
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest.,通过这个对象的方法,可以获得客户端的所有信息