Java 学习 - JavaServerPages

举报
亿人安全 发表于 2023/05/18 16:52:40 2023/05/18
【摘要】 JavaServerPages 学习环境搭建打开 idea,创建一个新项目PLAINTEXT12345选择 “Maven” jdk1.8组件选择:org.apache.maven.archetypes 下的 maven-archetype-webapp项目创建后等待资源加载,第一次时间较久出现下图表示加载成功配置编译路径和 artifact快捷键 ctrl+alt+shift+s配置 tom...

JavaServerPages 学习

环境搭建

打开 idea,创建一个新项目

PLAINTEXT

1
2
3
4
5
选择 “Maven” 
jdk1.8

组件选择:
org.apache.maven.archetypes 下的 maven-archetype-webapp

image-20221024092133722image-20221024092446573

项目创建后等待资源加载,第一次时间较久

image-20221024092704609

出现下图表示加载成功

image-20221024093336477

配置编译路径和 artifact

快捷键 ctrl+alt+shift+s

image-20221024093649725

image-20221024093729517

配置 tomcat 服务器

 http://tomcat.apache.org 下载对应的版本

在 web 项目中导入 tomcat,点击 idea 右上角的 add configuration

选择 other–tomcatserver–local

image-20221024094058449

配置端口,这里避免端口冲突换成 8081,上下保持一致即可

image-20221024094223534

导入 tomcat 包

image-20221024094341176

fix 添加 war

image-20221024094558974image-20221024094632134

最终效果

image-20221024094718837

无报错启动成功

访问 http://127.0.0.1:8081/maventest/index.jsp

image-20221024101414367

JSP Servlet 实例

  • 作用:Servlet 定义是容器端小程序,用于直接处理后端业务逻辑

选择 webapp 右键标记为源根

image-20221024102044136

 webapp 下创建一个 com 文件夹,在 com 文件夹下创建一个 serlvet 文件夹

src->main->webapp->com->Servlet

在 serlvet 文件夹下新建 HelloServlet.java

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.Servlet;

import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet实现类HelloServlet
 * 注册一个注解,这样方便我们不通过 web.xml 也可以在web中访问该类
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
    public HelloServlet() {
        super();
    }

    /**
     * @param request
     * @param response
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 使用 GBK 设置中文正常显示
        response.setCharacterEncoding("GBK");
        response.getWriter().write("HelloServlet类GET方法被调用");
    }

    /**
     * @param request
     * @param response
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 使用 GBK 设置中文正常显示
        response.setCharacterEncoding("GBK");
        response.getWriter().write("HelloServlet类POST方法被调用");
    }
}

修改 WEB-INF 目录下的 web.xml 为如下内容

XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
  <!-- 类名 -->
  <servlet-name>HelloServlet</servlet-name>
  <!-- 所在的包路径 -->
  <servlet-class>com.Servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
  <!-- 与 <servlet> 标签里面的 <servlet-name> 字段保持一致 -->
  <servlet-name>HelloServlet</servlet-name>
  <!-- web访问的网址 -->
  <url-pattern>/TomcatTest/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>

点击运行报错

image-20221024105721661

选择库,点击添加 servlet-api.jar

image-20221024110018742

通过注解访问文件

image-20221024114301962

通过 web.xml 访问文件

image-20221024114358957

JSP Filter 实例

  • Filter 也叫过滤器,通常配置在 MVC、Servlet 和 JSP 请求前面,常用于后端权限控制

通过注解配置映射关系,直接在 GlobalFilter.java 完成配置这样就无需在 web.xml 配置映射了

PLAINTEXT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
参数: urlPatterns
作用: 配置要拦截的资源
	以指定资源匹配,例如:"/hello.jsp"
	以目录匹配,例如:"/Servlet/*"
	以后缀名匹配,例如:"*.jsp"
	通配符,拦截所有web资源,例如:"/*"
	
参数: initParams
作用: 配置初始化参数

参数: dispatcherTypes
作用: 配置拦截的类型,可配置多个
默认为DispatcherType.REQUEST

其中DispatcherType是个枚举类型,有下面几个值
FORWARD //转发的
INCLUDE //包含在页面的
REQUEST //请求的
ASYNC //异步的
ERROR //出错的

 webapp 下创建一个 com 文件夹,在 com 文件夹下创建一个 filter 文件夹

src->main->webapp->com->filter

在 serlvet 文件夹下新建 GlobalFilter.java

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(
        filterName = "/GlobalFilter",
        urlPatterns = "/*",
        initParams = {
                @WebInitParam(name = "origin", value = "@WebFilter"),
                @WebInitParam(name = "testName", value = "testValue")
        },
        dispatcherTypes = {
                DispatcherType.REQUEST,
                DispatcherType.INCLUDE,
                DispatcherType.FORWARD,
                DispatcherType.ERROR,
                DispatcherType.ASYNC})
public class GlobalFilter implements Filter {
    /**
     * web 应用程序启动时
     * web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能
     * 从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)
     * 开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象
     *
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig config) throws ServletException {
        // 获取初始化参数
        String origin = config.getInitParameter("origin");
        String testName = config.getInitParameter("testName");
        // 输出初始化参数
        System.out.println("GlobalFilter类起源: " + origin);
        System.out.println("GlobalFilter类testName值: " + testName);
    }

    /**
     * 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法
     *
     * @param request  当前请求
     * @param response 当前响应
     * @param chain    用于访问后续过滤器
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 输出站点名称
        response.setCharacterEncoding("GBK");
        response.getWriter().println("我是全局过滤器: GlobalFilter类");

        // 允许访问目标资源,简称 放行
        chain.doFilter(request, response);
    }

    /**
     * Filter容器在销毁过滤器实例前调用该方法
     */
    @Override
    public void destroy() {
        System.out.println("GlobalFilter类,被摧毁了");
    }
}

访问任意资源文件,过滤器的 doFilter 方法被执行

image-20221024142714373

HttpServletRequest 常用方法

HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法就可以获取到客户端请求的所有信息

方法 说明
getParameterNames() 获取所有的参数名
getParameter(String name) 通过参数名获取对应的值,如果有重复的名,则返回第一个的值
getParameterValues(String name) 通过参数名获取指定参数的所有值,返回为 String 数组
getMethod() 获取请求发送的方式,例如:GET/POST
getQueryString() 获取请求的 URL 地址中附带的参数
getRequestURL() 获取请求的资源
getRequestURL().toString() 获取请求的 URL 地址
getRequestURI() 获取发出请求字符串的客户端地址
getContextPath() 返回项目的名字,如果项目为根目录,也就是 “/”, 则返回空
getServletPath() 返回客户端所请求的脚本文件的文件路径
getPathInfo() 返回传递到 Servlet 的路径,如果没有传递额外的路径信息,则返回 NULL
getRemoteAddr() 获取客户端的 IP 地址
getRemoteHost() 获取客户端的名字
getRemotePort() 获取客户端使用的网络端口号
getRemoteUser() 获取发出请求的客户机的完整主机名
getLocalAddr() 获取 WEB 服务器的 IP 地址
getLocalName() 获取 WEB 服务器的主机名
setAttribute(String name,Object) 将数据作为 request 对象的一个属性存放到 request 对象中
getAttributeNames() 获取 request 对象的所有属性名返回为 Enumeration
getAttribute(String name) 获取 request 对象的 name 属性的值
removeAttribute(String name) 移除 request 对象的 name 属性
getCookies() 获取客户端的所有 Cookie 对象返回为 Cookie 数组
getSession() 获取 Session 会话对象
getHeaderNames() 获取所有 request Header 的属性名返回为 Enumeration
getHeader(String name) 获取指定名字的 request Header 的所有值
getHeaders(String name) 获取指定名字的 request Header 的所有值返回为 Enumeration
getContentLength() 获取请求的 Body 的长度
getCharacterEncoding() 获取请求中的字符编码方式

HttpServletResponse 常用方法

HttpServletResponse 对象用于响应客户端的请求,通过这个对象提供的方法就可以处理服务端对客户端请求响应

方法 说明
setContentType(String var1) 设置当前响应的 MIME 类型
setCharacterEncoding(String var1) 设置当前响应的字符编码
getWriter() 获取响应打印流对象
getOutputStream() 获取响应流对象
addCookie(Cookie var1) 添加指定的 Cookie 加入到当前响应中注:遇到同名,依然会进行新增操作
addHeader(String name, String value) 添加指定的名称与值到响应的 header 头信息中注:遇到同名,依然会进行新增操作
setHeader(String var1, String var2) 设置指定的名称与值到响应的 header 头信息中注:遇到同名,会进行修改操作
sendError(int var1, String var2) 使用指定状态码与内容发送一个错误到客户端
sendRedirect(String var1) 请求重定向例如:responst.sendRedirect (“index.jsp”); 例如:responst.sendRedirect (“http://baidu.com");
setStatus(int var1) 设置状态码,例如:302 重定向 304 控制缓存
addDateHeader(String var1, long var2) 添加 HTTP 响应头中的日期,加入对应名称的日期头信息注:遇到同名,依然会进行新增操作
setDateHeader(String var1, long var2) 设置 HTTP 响应头中的日期,加入对应名称的日期头信息注:遇到同名,依然会进行新增操作
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。