第四次总结
1.servlet
1.1 servlet重定向
绝对路径:
1 | if (worksForMe){ |
相对路径
对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 | <servlet> |
在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 | <servlet> |
在servlet中获取初始变量并输出到页面上:
1 | package servlet; |
访问http://localhost:8080/WeChatMiniProgram_war_exploded/ServletConfig
:
1.3 上下文初始化参数
初始化参数只针对一个servlet,但是如果需要一个全局的参数,就需药用到上下文初始化参数
1 | <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 | <listener> |
在listener包下新建Listener类:
1 | package listener; |
此时,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命令后才会在本地构建仓库.