Tomcat构建

文章详细介绍了软件的C/S和B/S架构,解释了动态资源与静态资源的区别。同时,讨论了不同类型的服务器,如Tomcat、webLogic和webSphere等,以及它们在JavaEE中的角色。此外,文章还深入讲解了Servlet的概念、生命周期,以及如何通过配置文件和注解注册Servlet,并提供了关于HTTP请求和响应对象的基本使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件架构

C/S:Client/Server.需要安装才能使用。

B/S:Brower/Server。有浏览器就可以。

资源分类

  • 动态资源:每个用户访问相同的资源后,得到的结果可能不一样,称为动态资源。动态资源被访问后,先转换为静态资源,再被浏览器解析。

  • 静态资源:所有的用户在访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析

服务器

  1. 服务器:安装了服务器软件的计算机。

  1. 服务器软件:接收用户的请求,处理请求,做出响应。(接请求,传参数,给响应)

  1. web服务器软件:接收用户的请求,处理请求,做出响应。(接请求,传参数,给响应)

在web服务器软件中,可以部署web项目。让用户通过浏览器来访问这些项目。

常见的服务器软件

  • 动态服务器:

webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

webSphere:IBM公司。大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

JBOSS:JBOSS公司。大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

Tomcat:Apache基金组织,中小型的javaEE服务器,仅仅支持少量的JavaEE规范servle/JSP。开源免费。(300左右的并发)

  • 静态服务器:

nginx:代理,极高的并发

apache:Apache基金组织。PHP领域。

Tomcat

  1. Tomcat早期是Sun公司。javaWEBServer
  1. Tomcat4.0,里程碑版本。实现了Servlet

Tomcat的目录结构

  • bin:存放的是Tomcat的启动,停止批量处理脚本文件

startup.bat,startup.sh:启动tomcat的脚本文件

shutdown.bat,showdown.sh:停止tomcat的脚本文件

  • conf:用来存放Tomcat的相关配置文件

Catania:用来存储每个虚拟机的context配置

Context.xml:定义所有的web应用需要加载的context配置

Catalina.properties:Tomcat的环境变量

Logging.properties:Tomcat的日志配置文件,修改Tomcat的日志级别。

server.xml:Tomcat的核心配置文件

  • lib:Tomcat服务器的依赖包

  • logs:Tomcat默认的日志存放目录

  • webapps:Tomcat默认的web应用部署目录

  • work:Web应用jsp代码生成和编译的临时目录。

Servlet

servlet就是一个Java程序,一个java类。用来处理请求和响应。

Servlet的生命周期

  • init():Servelt进行初始化。

在tomcat启动的时候就会对所有的Servelt进行初始化

init方法只初始化一次

单例模式。

  • service():处理请求

可以处理GET,POST,PUT,DELETE请求

  • destroy():释放资源

创建servlet的三种方式

  1. 实现javax.servlet.Servlet接口

  1. 继承javax.servlet.GenericServlet类

  1. 继承javax.servlet.HttpServlet类

Servlet注册的两种方式

通过配置文件web.xml方式注册----Servlet3.0之前

WEB-INF:加密路径,不允许在地址栏

在web.xml进行注册servlet

    <!---注册servlet-->
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <!--写全类名-->
        <servlet-class>com.jsoft.morning.Myservlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <!--url pattern 当发起什么样的请求的时候,才让myServlet去处理-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

通过注解方式进行注册√

@WebServlet("/haha")
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("MyServlet3 doGet....");
    }

Servlet的参数

HttpServletRequest:

简称request,代表请求对象,当请求来的时候,request会自动实例化

HttpServletResponse:

简称response

response代表响应,当请求来的时候,response会自动实例化。

如果写中文,需要设置相应的字符集

响应头:增加一个响应头,并且解决字符集问题。

        response.setCharacterEncoding("utf-8");
        response.addHeader("content-type","text/html;charaset=utf-8");
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("MyServlet3 doGet....");
        //向页面打印回去一句话
        //服务器和客户端之间的通信依然是使用的流
        response.setCharacterEncoding("utf-8");
        response.addHeader("content-type","text/html;charaset=utf-8");

        PrintWriter out = response.getWriter();
        //把后台想要给出的响应写会去
        out.write("我收到了你的请求!!!");
    }

URL匹配规则

  1. 精确匹配,每个servlet是可以处理多个请求的。

@WebServlet(urlPatterns = {"/haha","/haha1","/haha2"})

localhost:8080/javaweb20230214/haha2

  1. 路径匹配

@WebServlet(urlPatterns = {"/haha/*"})

localhost:8080/javaweb20230214/haha/aaa

  1. 扩展名匹配

@WebServlet(urlPatterns = {"*.do"})

localhost:8080/javaweb20230214/aaa.do

  1. 缺省匹配

@WebServlet(urlPatterns = {"/"})

注意:

不能出现/*.do

多看控制台

匹配顺序

  1. 精确匹配

  1. 路径匹配,先最长路径匹配,再最短路径匹配。 /user/* /user/add/*

  1. 扩展名匹配。

注意:扩展名匹配,前面不能有任何的路径,包括不能有/

/*和/的含义:
  • /*属于路径匹配。覆盖所有的扩展名匹配

  • /servlet中的特殊匹配模式

会拦截静态资源!!!

启动时初始化:

        <servlet-class>com.jsoft.morning.Myservlet1</servlet-class>
        <load-on-startup>1</load-on-startup>

Request

request功能分为以下几种:

  • 封装请求头:

  • 封装一些正文数据。如果是get请求,没有正文。

  • request实际上是一个域对象,可以把它当成map来添加和获取数据。

  • request提供请求转发功能。

常用的方法:

getRemoteaddr():获取客户端的IP地址。

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println(request.getRemoteAddr());
        System.out.println(request.getRemoteHost());
        if(Objects.equals(request.getRemoteHost(),"127.0.0.1")){
            response.getWriter().write("your Ip is closed!!!");
        }
    }

获取请求参数

常见的客户端传参方式:

  • 浏览器地址栏直接输入:GET请求

  • 超链:GET请求

  • 表单:可以是GET,可以是POST。

  • Ajax:可以是GET,可以是POST

GET请求和POST请求的区别?

GET请求:

  • 请求参数会在浏览器地址栏显示,所以不安全

  • 请求的参数长度在1k以内。

  • GET请求没有请求体

POST请求:

  • 请求参数不会显示在浏览器的地址栏,相对安全

  • 请求参数没有限制

  • 有请求体

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        response.addHeader("content-type","text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

//        System.out.println("username:"+username+",password:"+password);
        //调用service,调用dao,返回一个结果
        boolean flag=true;
        if(flag){
            out.write("登录成功,欢迎你"+username);
        }


    }
<form action="login" method="post">
username:<input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="登录">
</form>

登录注册:

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        Enumeration<String> names= request.getParameterNames();
        while(names.hasMoreElements()){
            System.out.println(names.nextElement().toString());
        }
        Map<String, String[]> parameterMap = request.getParameterMap();
        for(Map.Entry entry:parameterMap.entrySet()){
            System.out.println(entry.getKey()+"-->"+Arrays.toString((String[])entry.getValue()));
        };
        


        response.addHeader("content-type","text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

//        System.out.println("username:"+username+",password:"+password);
        //调用service,调用dao,返回一个结果
        boolean flag=true;
        if(flag){
            out.write("登录成功,欢迎你"+username);
        }


    }
<form action="login" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="gender" value="man">男
  <input type="radio" name="gender" value="woman" >女<br>
爱好:<input type="checkbox" name="hobby" value="swimming">游泳
  <input type="checkbox" name="hobby" value="readding">读书
  <input type="checkbox" name="hobby" value="writting">写字
  <br>
   复选:<select name="select" multiple>
  <option value="a">a</option>
  <option value="b">b</option>
  <option value="c">c</option>

</select>
<input type="submit" value="登录">
</form>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值