本文目录
- 引出
- 一、软件架构BS和CS
- 二、实现Web服务的条件和步骤
- 三、Tomcat搭建Web项目初步
- 1.pom.xml文件配置
- 2.web.xml文件更新
- 3.Tomcat运行环境配置
- 4.项目文件层级解析
- 四、JavaWeb项目文件分类
- (1)静态文件—存放位置
- (2)动态文件---servlet
- 五、Servlet的创建和访问
- 1.Servlet程序编写---从servlet到HttpServlet
- 2.从xml中的配置路径,到@WebServlet注解实现配置
- 3. Servlet访问路径分析【重点】
- 4.Servlet的生命周期
- 六、Servlet启动异常原因
- 程序启动就报错:
- 七、网页的状态码解析
- 200正常
- 500异常--服务器异常Java代码
- 400异常----get方法长度限制
- 404异常----页面找不到
- 302重定向---地址变化
- 总结
引出
javaweb相关的内容比较多,知识点杂,本博客主要包括tomcat搭建web项目的初步,配置文件可参考;理解静态文件、动态文件,及其访问方式的区别;Servlet的创建和访问,访问路径分析;常见的Servlet启动异常原因;以及网页状态码的解析。
一、软件架构BS和CS
通俗解释,微信电脑版就是一个CS架构,微信网页版就是一个BS 架构。CS是客户端-服务器,BS是浏览器-服务器。比如登录QQ,CS要安装一个软件QQ软件,再登录访问,登录百度网站BS只需要打开浏览器就可以操作。
CS架构:
CS(Client/Server):客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任务分配到Client 和Server两端,降低了系统的通讯开销。C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。
C/S 架构是一种典型的两层架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。
BS架构
BS(Browser/Server):浏览器----服务器结构,是目前应用系统的发展方向。BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区别于传统的C/S 模式,特意称为B/S模式。在这种结构下,通过W3浏览器来进入工作界面,极少部分事务逻辑在前端(Browser)实现,主要事务逻辑在服务器端(Server)实现,形成三层(3-tier)结构。这样使得客户端电脑负荷大大简化(因此被称为瘦客户端),减轻了系统维护、升级的支出成本,降低了用户的总体成本(TCO)。
BS的主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,难以实现传统模式下的特殊功能要求。它是瘦客户端,对大量的数据输入以及报表的应答等都需要通过浏览器与服务器进行交互,通信开销大,而且对于实现复杂的应用构造有较大的困难。
二、实现Web服务的条件和步骤
把拥有资源的电脑叫服务器,把访问别人资源的电脑叫客户端。客户端要访问到服务器,需要下面一些条件:
- 两台电脑网络是通的
- 服务器允许并提供服务让别人访问这些html(需要在服务器安装一个web服务软件)
- 客户端通过浏览器输入地址访问服务器资源
上面第二步中的这个软件,就叫web服务器软件,我们常用的免费就是tomcat,其他收费的还有weblogic,websphere等。
上述过程分为为以下几步:
1)客户端发送请求:用户 通过 客户端的浏览器向服务器发送请求,等待服务器 的 响应;
2)服务器处理请求:服务器对接收到的请求进行解析和处理,并产生响应;
3)服务器发送响应 :服务器 把用户请求的数据返回给浏览器;
4)浏览器 呈现结果:客户端的浏览器 解释执行 HTML文件, 呈现相应的界面和结果 。
三、Tomcat搭建Web项目初步
1.pom.xml文件配置
主要是下面几项
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
完整版本的xml文件,包含Jsp相关的包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianju</groupId>
<artifactId>javaWebHome0525</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- jsp导包-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<!-- 加provided-->
<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>
</dependencies>
<build>
<finalName>javaWebHome0525</finalName>
</build>
</project>
2.web.xml文件更新
默认的web.xml版本比价低,用下面的内容代替,如果不替换,会出现一些功能不支持的情况
<?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">
</web-app>
3.Tomcat运行环境配置
上下文英文叫:Context未来在很多地方都可以看到,中文翻译为上下文,也可以理解成"容器",他表示着我们这个应用。
比如一个tomcat里面,可能放了多了应用程序,每个程序都有一个login链接,那怎么去区分每一个程序,就是使用应用上下文。
这里设置成day01。
4.项目文件层级解析
用tomcat创建的web项目的项目层级如下图所示:
四、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
访问该链接时的行为的具体分析
除了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目录下寻找下面三个文件,找到后进行响应,不需要我们手动输入
(2)动态文件—servlet
@WebServlet(value = “/user/delete”)
http://localhost:8080/day02/user/delete
补充:前端代码<a href
<from action="/day02/xxx">
绝对路径会拼接到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>
<!-- servlet 会在tomcat启动时自动启动,设置成正数-->
<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定位到这里
3. Servlet访问路径分析【重点】
Servlet访问路径和静态资源访问路径的对比:
从xml文件到注解设置:
(1)初级版本xml;
(2)注解版本,@WebServlet
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"?>
<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>demoServlet</servlet-name>
<servlet-class>com.woniu.servlet.DemoServlet</servlet-class>
<!-- servlet对象默认访问时才生成,如果希望tomcat启动就生成对象,需要单独设置
负数就是启动的时候执行一次,0或者正整数,10以下的数字,服务器启动的时候就被创建-->
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
六、Servlet启动异常原因
程序启动就报错:
(1)@WebServlet(value = “/us”) 中反斜杠 / 没有写;
(2)两个Serlet 指向同一个路径;
(3)DBUtils里面的静态方法出问题;
七、网页的状态码解析
200正常
500异常–服务器异常Java代码
细节:null和空,null调用方法会出现空指针异常
400异常----get方法长度限制
404异常----页面找不到
302重定向—地址变化
总结
1.tomcat搭建web项目初步,xml配置文件设置;
2.JavaWeb项目静态、动态文件存放,及其访问链接分析;
3.Servlet的创建和访问,访问路径分析,@WebServlet实现;
4.servlet启动异常原因分析;
5.网页状态码解析;