javaEE基础
1.javaEE概述
1.1javaEE容器
javaEE容器不是程序员需要编写的内容,它是依照JavaEE规范提供的集合工具.
- web容器
- EJB容器
- 其他Java应用容器
1.2javaEE组件
运行在javaEE容器里的程序片段,程序以Java为主语言.
2.开发环境
2.1tomcat
Tomcat支持HTTP,并支持Web容器规划的实现,它支持HTTP技术,如:HTML,CSS.也支持JSP,servlet等JavaEE技术.
文件夹 | 说明 |
---|---|
bin | 放置Tomcat命令,如startup.bat为启动命令,shutdown.bat为关闭命令. |
conf | 放置Tomcat的配置,如编码的设置 |
lib | 存放启动的包,比如我们使用Tomcat的数据源,需要将对应的数据库链接包放在这里. |
logs | 放置Tomcat的日志文件 |
temp | 放置Tomcat的缓存内容 |
webapp | Web项目部署目录,我们可以把javaEE的Web项目放置在这里,它会自行发布 |
work | 工作目录,在web容器运行时,JSP会被翻译成Servlet,而翻译Servlet生成的class文件可以存放在这里,这样后续运行的JSP速度就会更快. |
防止Tomcat控制台中发生乱码,在conf文件夹里的配置文件logging.properties里修改 ,重启后就不会乱码了
java.util.logging.ConsoleHandler.encoding=GBK
也可设置Tomcat的运行编码,在conf文件夹的server.xml中找到
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redircetport="8443" URIEncoding="UTF-8"/>
2.2maven
主要是方便我们引入依赖
2.3项目结构
文件 | 作用 |
---|---|
Java | 放置我们开发的java类 |
resource | 存放各种配置文件 |
web | 放置Web项目所需的各类文件,如HTML,JSP,JavaScript |
test | 测试文件 |
web.xml | javaEE Web项目的配置文件 在Sevrlet3.0以后不是必配 |
index.jsp | 一个默认欢迎界面 |
2.4Web项目发布包
将war包直接放入Tomcat的webapps包下也可以发布项目,一般来说,这样的方式更适合在项目正式发布的时候使用.
3.Web容器组件-Servlet
-
请求参数(HttpServletRequest):它代表请求,可以从请求中获得对应的参数和与之对应的信息
-
响应参数(HttpServletResponse):它代表响应客户的请求,可以通过它写入响应信息,也可以设置应答的类型和其他的相关信息
3.1请求
Servlet的继承关系:
init | 有参 无参 |
---|---|
service | doGet doPost service···方法 |
destroy | 销毁方法 |
Servlet的请求响应过程如图:
//使用@WebServlet将类标识为Servlet,Servlet容器会自动识别它
@WebServlet(
name = "myServlet",//Servlet名称
urlPatterns = "/my",//Servlet拦截路径,可以是正则表达式
asyncSupported = true,//是否异步,默认false
//启动顺序,小于等于0,不在项目启动时加载(第一次请求),大于0在项目启动时加载
loadOnStartup = 1,
initParams = {//设置Servlet参数
@WebInitParam(name = "init.param1",value = "1"),
@WebInitParam(name = "init.param2",value = "2")
}
)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得请求信息(1)
int port = req.getServerPort();
String url = req.getRequestURL().toString();
String uri = req.getRequestURI();
System.out.println("请求端口:" + port);
System.out.println("url:" + url);
System.out.println("uri:" + uri);
//获取请求头(2)
String userAgent = req.getHeader("User-Agent");
System.out.println("User-Agent:"+userAgent);
//获取参数(3)
/*String parameter = req.getParameter("....");*/
//获取请示上下文(4)
ServletContext application = req.getServletContext();
//设置上下文属性
application.setAttribute("application","随便一个值");
//修改请求参数(5)
req.setAttribute("param1","随便一个值1");
//获取session(6)
HttpSession session = req.getSession();
//修改session属性和设置超时时间s
session.setAttribute("session1","随便一个值");
session.setMaxInactiveInterval(1800);
//跳转页面(7)
//会传递请求和响应上下文,同时地址不变
req.getRequestDispatcher("test.html").forward(req,resp);
resp.getWriter().print("hello world!");
}
内置对象 | 作用域 |
---|---|
request | 当次用户请求有效 |
session | 浏览器和服务器会话之间有效session是浏览器和服务器通信期间为了保证通讯数据而开辟的内存空间,记录与浏览器之间的会话数据 |
application | Web项目在Servlet容器的存活期间有效 |
请求头 | 说明 | 示例 | 状态 |
---|---|---|---|
Accept | 可接受的响应内容类型(Content-Types)。 | Accept: text/plain | 固定 |
Accept-Charset | 可接受的字符集 | Accept-Charset: utf-8 | 固定 |
Accept-Encoding | 可接受的响应内容的编码方式。 | Accept-Encoding: gzip, deflate | 固定 |
Accept-Language | 可接受的响应内容语言列表。 | Accept-Language: en-US | 固定 |
Accept-Datetime | 可接受的按照时间来表示的响应内容版本 | Accept-Datetime: Sat, 26 Dec 2015 17:30:00 GMT | 临时 |
Authorization | 用于表示HTTP协议中需要认证资源的认证信息 | Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE== | 固定 |
Cache-Control | 用来指定当前的请求/回复中的,是否使用缓存机制。 | Cache-Control: no-cache | 固定 |
Connection | 客户端(浏览器)想要优先使用的连接类型 | Connection: keep-aliveConnection: Upgrade | 固定 |
Cookie | 由之前服务器通过Set-Cookie(见下文)设置的一个HTTP协议Cookie | Cookie: $Version=1; Skin=new; | 固定:标准 |
Content-Length | 以8进制表示的请求体的长度 | Content-Length: 348 | 固定 |
Content-MD5 | 请求体的内容的二进制 MD5 散列值(数字签名),以 Base64 编码的结果 | Content-MD5: oD8dH2sgSW50ZWdyaIEd9D== | 废弃 |
Content-Type | 请求体的MIME类型 (用于POST和PUT请求中) | Content-Type: application/x-www-form-urlencoded | 固定 |
Date | 发送该消息的日期和时间(以RFC 7231中定义的"HTTP日期"格式来发送) | Date: Dec, 26 Dec 2015 17:30:00 GMT | 固定 |
Expect | 表示客户端要求服务器做出特定的行为 | Expect: 100-continue | 固定 |
From | 发起此请求的用户的邮件地址 | From: user@itbilu.com | 固定 |
Host | 表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略。 | Host: www.itbilu.com:80Host: www.itbilu.com | 固定 |
If-Match | 仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某个资源后,该资源未被修改的情况下,才更新该资源。 | If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd” | 固定 |
If-Modified-Since | 允许在对应的资源未被修改的情况下返回304未修改 | If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT | 固定 |
If-None-Match | 允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified ),参考 超文本传输协议 的实体标记 | If-None-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd” | 固定 |
3.2响应
HashMap<String, String> map = new HashMap<>();
map.put("param1","参数1");
map.put("param1","参数2");
//转化为JSON数据集
String json = JSON.toJSONString(map);
//设置响应信息为JSON类型
resp.setContentType("application/json");
//设置响应编码为UTF-8
resp.setCharacterEncoding("UTF-8");
//设置响应头
resp.setHeader("success","true");
//设置状态码,200表示成功
resp.setStatus(200);
//跳转
resp.sendRedirect("/ch.jsp");
3.3过滤器
package javax.servlet;
import java.io.IOException;
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
//标识为过滤器
@WebFilter(
//过滤器的名字
filterName = "myServletFilter",
//过滤范围
urlPatterns = {"request/*","/response/*"},
//过滤的Servlet
servletNames = {"request","myServlet"}
)
public class MyServletFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//强制转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding("UTF-8");
//获取参数
String s = request.getParameter("void");
if (s == null || s.trim().equals("")){
//拦截成功
return;
}
//放行请求
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
3.4监听器
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Servlet上下文初始化后的逻辑");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Servlet上下文销毁后的逻辑");
}
}
contextInitialized
会在过滤器的init方法执行之前执行,contextDestroy
会在过滤器的destroy方法执行之后执行
3.5Servlet容器初始化器
@HandlesTypes(value = {String.class})
public class WebContainerInitializer implements ServletContainerInitializer{
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
}
}
3.6使用Cookie
public class MyCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//实例化Cookie
Cookie cookie = new Cookie("name", "YaoHui");
Cookie cookie1 = new Cookie("password", "123456");
//将cookie传入本地浏览器
resp.addCookie(cookie);
resp.addCookie(cookie1);
}
}
3.7提交表单
3.8使用web.xml
<!-- 设置项目主界面-->
<welcome-file-list>
<welcome-file>main.html</welcome-file>
</welcome-file-list>
服务端获取信息,它的安全性较差,且对提交数据的类型和长度有所限制,同时,参数在URL中是可见的,它的优势是传输速度比较快.POST请求时浏览器向服务端提交数据,数据的类型和长度是不受限的,同时数据参数可以放在表单中,不在URL中显示出来,安全度也较高,但性能可能会低一点.由于表单涉及商业数据,比较重要,因此提交表单的操作会使用POST请求.
3.8使用web.xml
<!-- 设置项目主界面-->
<welcome-file-list>
<welcome-file>main.html</welcome-file>
</welcome-file-list>