JavaWeb

JavaWeb介绍

  • java中,动态web资源开发技术
  • web应用程序 -> Tomcat:服务器
  • web应用程序编写完毕后,若想提供给外接访问,需要服务器统一管理
  • 客户端 -> 请求 request -> 服务器 webServer
  • 服务器 -> 响应 response -> 服务器
  • 静态Web:WebServerPlugin -> WebServer -> FileSystem
  • 动态Web: WebServerPlugin -> 动态Web资源

web服务器:处理请求、给用户响应信息

  • ASP: 微软,HTML中嵌入VB脚本
  • JSP/Servlet: B/S架构

tomcat:一个免费的开放源代码的Web 应用服务器

  • tomcat 默认端口号:8080
  • mysql:3306
  • http:80
  • https:443
  • 默认主机名:localhost -> 127.0.0.1
  • 默认网站应用存放位置:webapps

网站是如何进行访问的

  • 输入域名, 回车
  • 检查本机 C:WindowsSystem32driversetchosts 配置文件下有没有这个域名的映射,如果有直接返回对应的IP地址,可以直接访问;否则去DNS服务器(全世界的域名在此管理)找到返回。

如何发布一个网站

  • 直接将自己的项目放在webapps下,就可以访问

HTTP:超文本传输协议,一个简单的请求-响应协议(403)

  • http请求:客户端发起到服务器
  • http响应:服务器响应到客户端
  • 请求行方式:GET:一次能携带的参数较少,不安全,但高效/POST:携带参数无限制,安全不高效
  • 消息头
  • 响应状态码:200请求成功、3XX请求重定向、4XX找不到资源、5XX服务代码错误 502网关错误

Maven: 架构管理工具

  • 核心思想:约定大于配置

注意:maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:

<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

Servlet:动态Web技术

  • sun公司在API中提供一个接口:Servlet
  • 编写一个类实现servlet接口
  • 把开发好的java类部署到web服务器
  • Servlet -> GenericServlet -> HttpServlet -> 自定义

Servlet原理

  • 浏览器向web容器发起http请求
  • 调用servlet中的service方法
  • 自己实现类重写这些方法
  • response返回请求之后的响应,web容器读取响应信息
  • 将响应返回给客户端

mapping

  • 一个servlet可以指定一个、多个、通用、后缀、前缀映射路径
<!-- 注册一个servlet -->
<servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.zcs.helloservlet</servlet-class>
</servlet>
<!-- mapping -->
<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <!-- url请求 -->
        <url-pattern>/hello</url-pattern>
</servlet-mapping>
  • 优先级:固有的映射路径优先级最高,找不到会走默认的映射路径

ServletContext

web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,它代表当前web应用

  • 共享数据:在此Servlet中保存的数据,可在另外一个Servlet中保存
String username = "zcs";
ServletContext context = req.getServletContext();
context.setAttribute("username", username);
  • 获取初始化参数
    <!--配置一些web应用初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String url = context.getInitParameter("url");
    resp.getWriter().print(url);
}
  • 请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    System.out.println("进入了ServletDemo04");
    //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
    //requestDispatcher.forward(req,resp); //调用forward实现请求转发;
    context.getRequestDispatcher("/gp").forward(req,resp);
}
  • 读取资源文件

Properties

  • 在java目录下新建properties
  • 在resources目录下新建properties

发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:

思路:需要一个文件流;

username=root12312
password=zxczxczxc
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");
        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user+":"+pwd);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse

B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向

  • 重定向和转发的区别?

相同点

  • 页面都会实现跳转

不同点

  • 请求转发的时候,url不会产生变化
  • 重定向时候,url地址栏会发生变化;

session、cookie

  • cookie: 客户端技术(请求、响应)
  • session:服务器技术、可以保存会话信息
  • 服务器给每个用户(浏览器)Session对象
  • 一个Session会独占一个浏览器 -> 保存购物车信息

Session与Cookie区别:

JSP:Java Server Pages

  • JSP中可以嵌入Java代码,为用户提供动态数据<%%>

原理

  • 浏览器向服务器发送请求,访问Servlet
  • JSP最终会转换成一个Java类
  • JSP本质就是一个Servlet类
  • JSP页面 -> JSP转换成的Java文件 -> xxx_jsp.java -> xxx_jsp.class -> 返回给服务器
  • JSP页面中java代码会原封不动输出、HTML代码会转换成out.write(xxx)

基础语法、指令

  <%--JSP表达式
  作用:用来将程序的输出,输出到客户端
  <%= 变量或者表达式%>
  --%>
  <%= new java.util.Date()%>
  • jsp脚本片段

  <%--jsp脚本片段--%>
  <%
    int sum = 0;
    for (int i = 1; i <=100 ; i++) {
      sum+=i;
    }
    out.println("<h1>Sum="+sum+"</h1>");
  %>

脚本片段的再实现

  <%
    int x = 10;
    out.println(x);
  %>
  <p>这是一个JSP文档</p>
  <%
    int y = 2;
    out.println(y);
  %>

  <hr>


  <%--在代码嵌入HTML元素--%>
  <%
    for (int i = 0; i < 5; i++) {
  %>
    <h1>Hello,World  <%=i%> </h1>
  <%
    }
  %>
  • JSP声明
  <%!
    static {
      System.out.println("Loading Servlet!");
    }

    private int globalVar = 0;

    public void zcs(){
      System.out.println("进入了方法Kuang!");
    }
  %>

JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!

在JSP,嵌入Java代码即可!

<%%>
<%=%>
<%!%>

<%--注释--%>

JSP的注释,不会在客户端显示,HTML就会!

  • JSP指令
<%@page args.... %>
<%@include file=""%>

<%--@include会将两个页面合二为一--%>

<%@include file="common/header.jsp"%>
<h1>网页主体</h1>

<%@include file="common/footer.jsp"%>

<hr>


<%--jSP标签
    jsp:include:拼接页面,本质还是三个
    --%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>

  • 大内置对象
  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application 【SerlvetContext】 存东西
  • config 【SerlvetConfig】
  • out
  • page ,不用了解
  • exception
pageContext.setAttribute("name1","zcs1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","zcs2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","zcs3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","zcs4号");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

  • JSP标签、JSTL标签、EL表达式
<!-- JSTL表达式的依赖 -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

EL表达式: ${ }

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

JSP标签

<%--jsp:include--%>

<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>

<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="zcs"></jsp:param>
    <jsp:param name="age" value="20"></jsp:param>
</jsp:forward>

JSTL表达式

JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!

格式化标签

SQL标签

XML 标签

核心标签 (掌握部分)

JSTL标签库使用步骤

  • 引入对应的 taglib
  • 使用其中的方法
  • 在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误

c:if

<head>
    <title>Title</title>
</head>
<body>


<h4>if测试</h4>

<hr>

<form action="coreif.jsp" method="get">
    <%--
    EL表达式获取表单中的数据
    ${param.参数名}
    --%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>

<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="管理员欢迎您!"/>
</c:if>

<%--自闭合标签--%>
<c:out value="${isAdmin}"/>

</body>

c:choose c:when

<body>

<%--定义一个变量score,值为85--%>
<c:set var="score" value="55"/>

<c:choose>
    <c:when test="${score>=90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score>=80}">
        你的成绩为一般
    </c:when>
    <c:when test="${score>=70}">
        你的成绩为良好
    </c:when>
    <c:when test="${score<=60}">
        你的成绩为不及格
    </c:when>
</c:choose>

</body>

c:forEach

<%

    ArrayList<String> people = new ArrayList<>();
    people.add(0,"张三");
    people.add(1,"李四");
    people.add(2,"王五");
    people.add(3,"赵六");
    people.add(4,"田六");
    request.setAttribute("list",people);
%>


<%--
var , 每一次遍历出来的变量
items, 要遍历的对象
begin,   哪里开始
end,     到哪里
step,   步长
--%>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"/> <br>
</c:forEach>

<hr>

<c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
    <c:out value="${people}"/> <br>
</c:forEach>

JavaBean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法;

一般用来和数据库的字段做映射 ORM;

MVC:view -> Controller -> Model

view

  • 展示数据模型
  • 提供用户操作

Controller

  • 接收用户请求
  • 交给业务层, 返回数据
  • 视图跳转

Model: service Dao -> DataBase

  • 业务处理(Service)
  • 数据持久层(Dao)

Filter

实现Filter接口,重写对应的方法即可

public class CharacterEncodingFilter implements Filter {

//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("CharacterEncodingFilter初始化");
}

//Chain : 链
/*
1. 过滤中的所有代码,在过滤特定请求的时候都会执行
2. 必须要让过滤器继续同行
    chain.doFilter(request,response);
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=UTF-8");

    System.out.println("CharacterEncodingFilter执行前....");
    chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
    System.out.println("CharacterEncodingFilter执行后....");
}

//销毁:web服务器关闭的时候,过滤会销毁
public void destroy() {
    System.out.println("CharacterEncodingFilter销毁");
}
}
  1. 在web.xml中配置 Filter
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <!--只要是 /servlet的任何请求,会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
    <!--<url-pattern>/*</url-pattern>-->
</filter-mapping>
原文地址:https://www.cnblogs.com/Hot-machine/p/13296408.html