第四次总结

1.servlet

1.1 servlet重定向

绝对路径:

1
2
3
4
5
if (worksForMe){
//处理请求
} else {
response.sendRedirect("https://www.baidu.com");
}

相对路径

对URL有两种类型:前面有斜线(“/“)和没有斜线:

假如用户原本访问的是:http://localhost:8080/WeChatMiniProgram_war_exploded/SettingsServlet,

  • 前面有斜线:

    请求到达名为servlet_1的servlet后,使用sendRedirect重定向:

    1
    sendRedirect("/index.html")

    此时将访问:http://localhost:8080/404.html

  • 前面没有斜线:

    如果使用sendRedirect重定向如下:

    1
    response.sendRedirect("index.html");

    此时将访问 http://localhost:8080/WeChatMiniProgram_war_exploded/index.html

注意:response.sendRedirect(new URL("https://www.baidu.com"));是不对的,response.sendRedirect("");中需要的是一个String参数

总结:HttpServletResponse

  • 响应对象向用户发回数据
  • 常用方法:sentContentType()和getWriter(),前者用于告诉浏览器怎么处理随响应到来的数据(MIME类型),后者用来完成字符IO,向流写入HTML或其他内容
  • 大多数HTML响应都可能使用JSP发送,但也有少数使用一个响应流向客户发送二进制数据,入一个JAR包.
  • 要得到二进制流,需要在响应上调用getOutputStream()方法
  • 如果不对一个请求作出相应,也可以重定向到一个URL.(sendRedirect方法)
  • 要么作出相应,要么重定向,不能已经向响应流中写了东西后再去重定向
  • 请求分派和重定向的区别

1.2 初始化参数

可以把请求参数中传递给doGet()或doPost()方法,不过servlet还可以有初始化参数

在web.xml文件中,设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<servlet-name>SettingServlet</servlet-name>
<servlet-class>servlet.SettingsServlet</servlet-class>
<init-param>
<param-name>a</param-name>
<param-value>1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SettingServlet</servlet-name>
<url-pattern>/SettingServlet</url-pattern>
</servlet-mapping>

在servlet代码中

1
a = getServletConfig().getInitParameter("a")

这样就获取了a的值

在初始化前不能用servlet初始化参数,因为在容器调用init()之前,servlet还不是一个真正的servlet.

容器从web.xml文件中读取出初始化参数,并把这些参数交给ServletConfig,然后把ServletConfig传递给servlet的init()方法.

在之前覆盖的init()中取不到参数.没必要覆盖init(ServletConfig)方法,因为调用继承的getServletConfig()方法就可以得到参数了.

javax.servlet.ServletConfig中方法有:

  • getInitParameter()
  • Enumeration.getinitParameterNames()
  • getServletContext()
  • (不常用)getServletName()

在web.xml文件中写入初始变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<servlet>
<servlet-name>ServletConfig</servlet-name>
<servlet-class>servlet.ServletConfig</servlet-class>
<init-param>
<param-name>a</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>b</param-name>
<param-value>1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfig</servlet-name>
<url-pattern>/ServletConfig</url-pattern>
</servlet-mapping>

在servlet中获取初始变量并输出到页面上:

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
package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

/*
* @Author Sheng WenZeng
* @Date 2019/8/3 16:03
* @Version 1.0
*/public class ServletConfig extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<h2>Test Init Parameters</h2><hr><br>");

Enumeration e = getServletConfig().getInitParameterNames();
while (e.hasMoreElements()) {
out.print("param name = " + e.nextElement()+"<br>");
}
out.print("<br>a=" + getServletConfig().getInitParameter("a") + "<br>");
out.print("b=" + getServletConfig().getInitParameter("b"));
}
}

访问http://localhost:8080/WeChatMiniProgram_war_exploded/ServletConfig:

1.3 上下文初始化参数

初始化参数只针对一个servlet,但是如果需要一个全局的参数,就需药用到上下文初始化参数

1
2
3
4
<context-param>
<param-name>a</param-name>
<param-value>1</param-value>
</context-param>

注意,<context-param><web-app>标签下,而不嵌套于<servlet标签>

servlet代码:

1
a = getServletContext().getInitParameter("a");

每个servlet对应一个ServletConfig,每个Web应用对应一个ServletContext(前提是在一个JVM中.分布式环境中,每个JVM有一个ServletContext)

1.4 上下文监听者

但是上下文参数只能获取String类型的参数,如果需要一个对象或者数据库连接,那么就该使用上下文监听者.

它监听servlet一生中的两个关键事件:初始化和撤销.这个类实现javax.servlet.ServletContextListener接口

在web.xml文件中写入监听者以及上下文初始参数:

1
2
3
4
5
6
7
8
<listener>
<listener-class>listener.Listener</listener-class>
</listener>

<context-param>
<param-name>a</param-name>
<param-value>1</param-value>
</context-param>

在listener包下新建Listener类:

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
package listener;

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

/**
* @author Sheng Wenzeng
* @ClassName Listener
* @Description TODO
* @Date 2019/8/3 16:27
* @Version 1.0
*/
public class Listener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
//初始化数据库连接的代码,或者从ServletContext中获取全局初始化参数等
ServletContext servletContext = event.getServletContext();
String a = servletContext.getInitParameter("a");
//构造一个对象
Dog dog = new Dog(a);
//使用上下文来设置属性.现在应用的其他部分将就可以得到属性dog的值了
servletContext.setAttribute("dog", dog);
}

public void contextDestroyed(ServletContextEvent event) {
//关闭数据库连接的代码
}
}

此时,servlet就可以获取到dog对象

1
Dog dog = (Dog) getServletContext().getAttribute("dog");

getAttribute()方法返回的类型是Object,所以需要强制类型转换

2. Maven仓库

2.1 定义

Maven在某个位置统一存储所有Maven项目的构件,这个统一的位置就是仓库.

根据构件的坐标定义仓库中的存储路径,如log4j:log4j:1.2.15这个依赖对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar.

2.2仓库的分类

本地仓库和远程仓库

当Maven查找构件时,先从本地仓库查找,如果本地仓库存在则直接使用;如果本地不存在则请求远程仓库并下载到本地仓库在使用.如果本地和远程仓库都没有就会报错.

远程仓库分为中央仓库和私服.

中央仓库是Maven核心自带的远程仓库,包括了绝大部分开源的构建.默认配置为中央仓库.

私服是一种特殊的远程仓库,为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有的远程仓库.内部项目还可以部署到私服上供其他的项目使用.

除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有java.net Maven库JBoss Maven库

Windows本地仓库位于C:\users\用户名\.m2\repository

Linux位于/home.m2/repository

自定义本地仓库位置:编辑配置文件~/.m2/setting.xml(Windows位于安装目录下的conf文件夹中,如apache-maven-3.6.1\conf),设置localrepository元素的值为想要的仓库地址

当用户输入第一条Maven命令后才会在本地构建仓库.

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×