java ee 核心设计模式
web浏览器 —— Servlet控制层(不需要业务逻辑) —— jsp页面 —— html doc —— web浏览器
web浏览器 —— Servlet控制层(需要业务逻辑) —— JavaBean(简单java类)、ejb、数据库 —— jsp页面 —— html doc —— web浏览器
启动的顺序为listener->Filter->servlet:简单记为:理(Listener)发(Filter)师(servlet)
Listener生命周期:一直从程序启动到程序停止运行
Filter生命周期:程序启动调用Filter的init()方法(永远只调用一次,具体看启动日志),程序停止调用Filter的destroy()方法(永远只调用一次,具体看关闭日志)
Servlet生命周期:程序第一次访问,会调用servlet的init()方法初始化(只执行一次,具体看日志),每次程序执行都会根据请求调用doGet()或者doPost()方法,程序停止调用destory()方法
maven安装jar到本地仓库
//一定要在idea中的控制台中输入
mvn install :install-file -DgroupId = com.aliyun -DartifactId = aliyun-java-sdk-core -Dversion = 3.3.1 -Dpackaging = jar -Dfile = test.jar
mvn install :install-file -DgroupId = com.oracle -DartifactId = ojdbc14 -Dversion = 10.2.0.4.0 -Dpackaging = jar -Dfile = ojdbc14-10.2.0.4.0.jar
xml
* 文档结构
* 前导区<?xml version="1.0" encoding="utf-8"?>
* version,xml版本
* encoding,编码
* standalone,此xml文件是否独立运行
* 数据区
* 必须只有一个根元素
* 每个元素必须完结,要求严格
* 区分大小写
* 可自定义属性
* 特殊字符显示 &:& <: < >: > ":" ':'
* <![CDATA[不希望被解析的部分]]>
* 如果要对xml文件的元素或属性进行约束,需要使用DTD和Schhema技术
* xml解析
* dom解析接口
* sax解析接口
* dom4j包 ```java /** * */ package com.icql.demo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
}
//环境变量
Path:加入 tomcat/bin
Using CATALINA_BASE: “D:\apache-tomcat-7.0.52”
Using CATALINA_HOME: “D:\apache-tomcat-7.0.52”
Using CATALINA_TMPDIR: “D:\apache-tomcat-7.0.52\temp”
Using JAVA_HOME: “C:\Program Files\Java\jdk1.8.0_121”
//修改默认端口号 conf/server.xml文件中,修改 8080
//web应用配置 conf/server.xml文件中 Server-Service-Engine-Host节点下加入
</Host>
</Engine>
</Service>
</Server>
```
http 状态码
```
* 2xx 请求成功
* 3xx 重定向
* 4xx (403禁止,404找不到指定资源)
* 5xx (服务器中出现的错误,500服务器内部错误)
```
## jsp
* 1.jsp语法
* 注释(html注释,jsp注释<%-- --%>,java注释)
* Scriptlet
* <%%>:可直接在里面写 java传统方法 里面的代码
* <%!%>:可在里面 定义类、方法、全局变量等;尽量不要使用
* <%=%>:输出一个变量或一个具体内容,表达式输出;尽量使用这种输出方式
* Scriptlet标签:中间写java代码 相当于<%%>,只是比较美观
* page指令 <%@ page langage="java" contentType="text/html;charset=GBK" %>
* contentType:设置页面MIME和编码,mime指的是文件后缀名及类型,charset编码指的是服务器发送给客户端的内容编码
* pageEncoding:设定jsp文件本身的编码
* 编码解释:若pageEncoding存在,则jsp的编码由pageEncoding决定,否则将由contentType中的charset属性决定;若两者都不存在,则将使用ISO-8859-1的编码方式,在jsp中,所有内容都要经过两次编码操作,第一阶段会使用pageEncoding编码,第二阶段会使用utf-8编码,第三阶段就是tomcat生成的网页,此时使用的才是 contentType;一般开发,jsp页面若只需要按照text/html显示,则设置pageEncoding设置编码即可
* errorPag:发生错误跳转至此属性设置的页面,可每个页面单独设置,也可全局设置,在web.xml文件中配置;若想要显示的error.jsp也被服务器认为出现了错误,可以在error.jsp中单独设置<% response.setStatus(200); %>让服务器始终认为此页面没有错误
* import:可以利用此属性在jsp页面导入java开发包,此属性可以多次出现,其余属性不可以,例如import="java.sql.*"
* autoFlush:
* buffer:
* extends:
* info:
* isErrorPage:
* isThreadSafe:
* language:
* session:
* 包含指令
* 静态包含<%@include file=""%>:先将文件内容包含进来,在一起处理,这样如果被包含的文件里定义的变量名和当前文件里面定义的变量名重复,会报错
* 动态包含 :先将要包含进来的文件处理,将处理后的静态页面再包含进来
```java
//传参
<jsp:param name="name" value"<%=username%>" />
<jsp:param name="info" value"icql" />
//接收
<%=request.getParameter("name")%>
<%=request.getParameter("info")%>
```
* 跳转指令
* 也可以传参
* 属于服务器跳转
* 2.jsp内置对象(由web容器实例化,可直接使用)
* 1、application(javax.servlet.ServeletContext)
* 可设置属性,生命周期在同一个web应用程序中,所有用户共享,设置过多影响服务器性能
* application.serAttribute("","")
* application.getAttribute("")
* 其他方法
* getRealPath(String path)
* getContextPath()
* getAttributeNames()
* 2、session(javax.servlet.http.HttpSession)
* 可设置属性,生命周期在同一个web应用程序中,每个用户有一个自己的sessinID,不同的用户由不同的session
* session.serAttribute("","")
* session.getAttribute("")
* 其他常用方法
* getId() 获取Session Id
* getCreateTime() 获取session创建时间
* getLastAccessdTime() 取得session最后一次操作时间,与上一个时间相减以获得用户在此停留的时间
* isNew() 是否新的session用户
* inValidate() 让session失效
* getAttributeNames()
* session 过期方式
* 1、手动调用 inValidate()
* 2、超过了配置的session超时时间,默认30分钟,与服务器无交互5
* 3、用户关掉了浏览器窗口,保存sessionId的cookie默认不设时间的话就会直接销毁,从而重新打开浏览器重新请求的时候,服务器会当成新用户重新创建sessino
* 3、request(javax.servlet.http.HttpServletRequest)
* 可设置属性,生命周期只在一次请求中,使用jsp:forward跳转属于服务器跳转,在此次请求当中,若用a标签直接换了新url去请求,属于新的请求,则不生效
* request.serAttribute("","")
* request.getAttribute("")
* javax.servlet.http.HttpServletRequest extends javax.servlet.http.ServletRequest
* request常用方法
* setCharacterEncoding()设置编码
* getParamterNames()
* getParameter()接收单个参数
* getParameterValues()接收同名参数数组,例如复选框,多个相同的name
```java
//一般设置多个相同name为"**"开头
Enumeration enu = request.getParameterNames();
while(enu.hasMoreElements()){
String paramName = (String)enu.nextElement();
if(paramName.startWith("**")){
String paramValue[] = request.getParameterValues(paramName);
}else{
String paramValue = request.getParameter(paramName);
}
}
```
* getHeaderNames()
* getHeader()
* getRemoteAddr()
* getMethod()
* getCookies()
* 提交方式get,set
* Http Header参数https://blog.csdn.net/alanlzz/article/details/72846718
* 4、pageCotext(javax.servlet.jsp.PageContext)jsp的页面容器
* 可设置属性,生命周期只在本jsp页面
* pageContext.serAttribute("","")
* pageContext.getAttribute("")
* 诸多方法可以取得以下的jsp内置对象
* forward(String relativeUrlPath)页面跳转
* response(javax.servlet.http.HttpServletResponse)
* response常用方法
* setHeader()设置响应头信息
* sendRedirect()重定向,浏览器会发出两次请求,属于客户端跳转,与的服务器端跳转不同
* addCookie()
* Cookie类常用方法
* public Cookie(String name,String value)
* public String getName()
* public String getValue()
* public void setMaxAge(int expiry) 设置Cookie保存时间
* config(javax.servlet.ServletConfig)
* getInitParameter(String name)
* getInitParameterNames()
* 在web.xml中设置参数
```java
```
* out(javax.servlet.jsp.JspWriter)
* 页面的输出操作,用的较少
* println()
* print()
* page(java.lang.Object),指向jsp页面本身,类似于 this
* exception(java.lang.Throwable)
* 3.javabean
* jsp导入javabean:
* 使用page指令导入包,然后手动实例化
*
* 设置指定属性
* 获得指定属性
* javabean保存范围:page request session application
* 删除javabean,使用上述4种的属性移除操作,例如 page.removeAttribute(javabean名称)
* 4.文件上传
* smartupload上传组件
```java
//单文件表单
SmartUpload smart = new SmartUpload();
smart.initialize(pageContext);
smart.upload();
smart.save("upload");
//多表单(既有文本又有文件),