Java网络开发(Tomcat)—— Servlet学习 & Web相关背景知识 + 网页状态码

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
  </dependency>

  <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
  </dependency>

  <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
  </dependency>
javaWebHome0525

### 2.web.xml文件更新


默认的web.xml版本比价低,用下面的内容代替,如果不替换,会出现一些功能不支持的情况



<?xml version="1.0" encoding="UTF-8"?>



### 3.Tomcat运行环境配置


上下文英文叫:Context未来在很多地方都可以看到,中文翻译为上下文,也可以理解成"容器",他表示着我们这个应用。


比如一个tomcat里面,可能放了多了应用程序,每个程序都有一个login链接,那怎么去区分每一个程序,就是使用应用上下文。


![在这里插入图片描述](https://img-blog.csdnimg.cn/bc6a1e630e2c44789bce42eae04c0778.png)  
 这里设置成day01。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f50b2f46b259445d900a296fccec2548.png)


### 4.项目文件层级解析


用tomcat创建的web项目的项目层级如下图所示:


![在这里插入图片描述](https://img-blog.csdnimg.cn/7788dcb0370340c5809c68caca52d360.png)


## 四、JavaWeb项目文件分类


### (1)静态文件—存放位置


放在webapp目录下面的 html img css 。。。



> 
> http://localhost:8080/day02/dir/xxx.html
> 
> 
> 


静态资源可以都放在webapp目录下面,常用静态资源包括html css js 图片等。html放在这个目录下,或者直接在这个目录下新建文件,通过浏览器就可以访问到了,比如在webapp下面放一个之前写好的html文件通过下面链接访问


http://localhost:8080/day01/login.html


![在这里插入图片描述](https://img-blog.csdnimg.cn/77506c7883404491af00a5e75b8addfb.png)


访问该链接时的行为的具体分析


![在这里插入图片描述](https://img-blog.csdnimg.cn/7360d95e96c84cb7962e854e9666ebf5.png)除了html,其他css img js等都可以访问到


**补充:关于index.html**


index,在互联网上表示网站的默认主页,一般为index.html、index.jsp等。比如我们访问百度


http://www.baidu.com/index.html,其实也可以跳转到百度,只是在很多web服务器index.html是可以省略的。tomcat中可以配置这个默认的页面,配置以后,如果我们输入http://localhost:8080, 没有输入下一级地址,tomcat会在我们webapp目录下寻找下面三个文件,找到后进行响应,不需要我们手动输入


![在这里插入图片描述](https://img-blog.csdnimg.cn/6ee7644124704ddd882a67da545df922.png)


### (2)动态文件—servlet


@WebServlet(value = “/user/delete”)



> 
> http://localhost:8080/day02/user/delete
> 
> 
> 


补充:前端代码<a href




绝对路径会拼接到localhost:8080/ 后面


## 五、Servlet的创建和访问


上面主要说了静态文件的访问,但是实际使用过程中,比如一个人登录,需要输入用户名,密码,发送到tomcat的day01服务后,服务需要程序来接收处理,然后去数据库比对,这个过程就需要java程序参与了,我们把前面那些纯html,图片叫静态资源。把用Java代码或者其他语言代码处理的叫动态资源。


### 1.Servlet程序编写—从servlet到HttpServlet



// tomcat启动时,默认不会new servlet对象;
// 当首次访问连接对应的servlet时候,才new DemoServlet对象;
// 后续操作,对象一直存在,只会调用service方法
// 结论:tomcat容器中,只有一个DemoServlet对象提供服务,在首次访问时创建



package com.tianju.servlet;

import javax.servlet.*;
import java.io.IOException;

public class DemoServlet implements Servlet {

// tomcat启动时,默认不会new servlet对象;
// 当首次访问连接对应的servlet时候,才new DemoServlet对象;
// 后续操作,对象一直存在,只会调用service方法
// 结论:tomcat容器中,只有一个DemoServlet对象提供服务,在首次访问时创建
@Override
public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("init~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

}

@Override
public ServletConfig getServletConfig() {
    System.out.println("getServletConfig");
    return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("service~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

}

@Override
public String getServletInfo() {
    System.out.println("getServletInfo~~~~~~~~~~~~~~~~~~~~~~~~~");
    return null;
}

@Override
public void destroy() {
    System.out.println("destroy~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

}

}


需要在web.xml文件中进行访问路径的配置



<servlet>
    <servlet-name>demoServlet</servlet-name>
    <servlet-class>com.tianju.servlet.DemoServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>/demo</url-pattern>
</servlet-mapping>

使用路径http://localhost:8080/day01/demo访问这个servlet


实际使用中用HttpServlet类,这个更好用



> 
> @WebServlet(value = “/us”,loadOnStartup = 1)  
>  (1)loadOnStartup=1 自动启动;  
>  (2)注解,访问http://localhost:10081/day01/us定位到这里;  
>  servlet启动失败原因:1.没加斜杆;2.两个servlet映射成一个url
> 
> 
> 


中文乱码编码问题的解决



    req.setCharacterEncoding("UTF-8");
    // 解决中文的显示问题
    response.setCharacterEncoding("UTF-8"); // 设置成编码
    response.setContentType("text/html;charset=utf-8"); // 展示的方式

完整的代码如下所示:



package com.tianju.servlet;

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;

/**
* tomcat, weblogic, 为web服务器
* nginx 静态服务器
*/
// loadOnStartup=1 自动启动
// @WebServlet(value = “/us”,loadOnStartup = 1)
// servlet启动失败原因:1.没加斜杆;2.两个servlet映射成一个url
@WebServlet(value = “/us”)
// 注解,访问http://localhost:10081/day01/us定位到这里
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
System.out.println(“这是UserServlet”);
System.out.println(“request获取”);
// http://localhost:10081/day01/us?username=root&password=123
req.setCharacterEncoding(“UTF-8”);
String username = req.getParameter(“username”);
String password = req.getParameter(“password”);
System.out.println(“输入用户名为:”+username);
System.out.println(“输入密码为:”+password);
// System.out.println(“如果没输入,调用方法”);
// username.trim(); // 会报500异常

    // 解决中文的显示问题
    response.setCharacterEncoding("UTF-8"); // 设置成编码
    response.setContentType("text/html;charset=utf-8"); // 展示的方式
    response.getWriter().write("<h2>inputSuccess<h2>");
}

}


### 2.从xml中的配置路径,到@WebServlet注解实现配置


@WebServlet(value = “/us”,loadOnStartup = 1)


servlet启动失败原因:1.没加斜杆;2.两个servlet映射成一个url



// loadOnStartup=1 自动启动
// @WebServlet(value = “/us”,loadOnStartup = 1)
// servlet启动失败原因:1.没加斜杆;2.两个servlet映射成一个url
@WebServlet(value = “/us”)
// 注解,访问http://localhost:10081/day01/us定位到这里


![在这里插入图片描述](https://img-blog.csdnimg.cn/247f5bb003d44529aaf42e453ab9941b.png)


### 3. Servlet访问路径分析【重点】


Servlet访问路径和静态资源访问路径的对比:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/726f782c10d64600a9d7b9d73f731f68.png)


从xml文件到注解设置:


(1)初级版本xml;


![在这里插入图片描述](https://img-blog.csdnimg.cn/b45994ec49094f26b8cc49ccf42704dc.png)


(2)注解版本,@WebServlet


![在这里插入图片描述](https://img-blog.csdnimg.cn/2924fafcf0aa4681a8d98f093c2f43cd.png)


### 4.Servlet的生命周期


Servlet类中的init方法和destory方法:



> 
> (1)init方法:servlet初始化时,会调用这个方法,但是整个服务运行期间只有一次;  
>  (2)destory方法:服务正常关闭时,会运行销毁方法
> 
> 
> 



public class DemoServlet extends HttpServlet {
/**
* servlet初始化时,会调用这个方法,但是整个服务运行期间只有一次
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println(“servlet初始化”);
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("访问");
}

/\*\*

* 服务正常关闭时,会运行销毁方法
*/
@Override
public void destroy() {
System.out.println(“servlet销毁”);
}
}


servlet对象默认访问时才生成,如果希望tomcat启动就生成对象,需要单独设置:负数就是启动的时候执行一次,0或者正整数,10以下的数字,服务器启动的时候就被创建;如果是注解的方式,则设置成:@WebServlet(value = “/us”,loadOnStartup = 1);xml文件,则进行如下配置:



<?xml version="1.0" encoding="UTF-8"?>

<servlet>
    <servlet-name>demoServlet</servlet-name>
    <servlet-class>com.woniu.servlet.DemoServlet</servlet-class>
    <load-on-startup>4</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>demoServlet</servlet-name>
    <url-pattern>/demo</url-pattern>
</servlet-mapping>

## 六、Servlet启动异常原因—程序启动就报错


### (1)@WebServlet(value = “/us”) 中反斜杠 / 没有写;


![在这里插入图片描述](https://img-blog.csdnimg.cn/284210ee52b24037995e3f2cd7cead0c.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/0a7fc0b479cb4746b236224330f19658.png)


### (2)两个Serlet 指向同一个路径;


![在这里插入图片描述](https://img-blog.csdnimg.cn/12a57aeceab140ef931e36cd3b23bbdc.png)


### (3)DBUtils里面的静态方法出问题;


DBUtils中的静态方法错误,导致项目启动失败:  
 报错信息:


15-Jun-2023 12:22:01.865 信息 [localhost-startStop-2] org.apache.catalina.core.StandardWrapper.unload 正在等待为Servlet[com.tianju.servlet.user.LoginService]释放[1]实例  
 15-Jun-2023 12:22:02.184 严重 [Druid-ConnectionPool-Create-88061993] com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl.error create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true, errorCode 1045, state 28000  
 java.sql.SQLException: Access denied for user ‘root’@‘localhost’ (using password: YES)


项目能够启动起来,但是单击登陆后,前端没有反应,后端一直报错,不断刷新;


报错原因:


Access denied for user ‘root’@‘localhost’ (using password: YES)


![在这里插入图片描述](https://img-blog.csdnimg.cn/532de4d84f3b4a4a8b3233a12fe71376.png)


解决方案:


密码要输入正确:



// TODO:静态方法错误,导致项目启动失败
String password = “123”;


另一种情况:


报错信息:


java.lang.NoClassDefFoundError: Could not initialize class com.tianju.util.DBUtils


![在这里插入图片描述](https://img-blog.csdnimg.cn/fb9c52923dd149449cd09d972f04a6ee.png)


报错信息:


严重 [Druid-ConnectionPool-Create-1816424755] com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl.error create connection SQLException, url: jdbc:mysql:😕/127.000.0.1:3306/javaweb?useSSL!!!=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true, errorCode 0, state null  
 java.sql.SQLException: connect error, url jdbc:mysql:😕/127.000.0.1:3306/javaweb?useSSL!!!=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true, driverClass com.mysql.cj.jdbc.Driver


![在这里插入图片描述](https://img-blog.csdnimg.cn/2e475da1f075488a933b94806243e982.png)


## 七、网页的状态码解析


### 200正常



![img](https://img-blog.csdnimg.cn/img_convert/62f5cb6364d51191b7cacd5624322b60.png)
![img](https://img-blog.csdnimg.cn/img_convert/f8ca66b9de1682b02bc5f17132cc55a1.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

hai&allowPublicKeyRetrieval=true, driverClass com.mysql.cj.jdbc.Driver


![在这里插入图片描述](https://img-blog.csdnimg.cn/2e475da1f075488a933b94806243e982.png)


## 七、网页的状态码解析


### 200正常



[外链图片转存中...(img-jYqlDOFc-1715059954470)]
[外链图片转存中...(img-hE3YzZxV-1715059954471)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值