目录
JAVA EE
基础
前端脚本:能够被浏览器识别处理的脚本,html,css,js
后端脚本:服务端脚本,java,php,c#.net
静态页面:全部为前端脚本的页面文件
动态页面:根据后端脚本执行完成的页面
java ee处理机制
-
1.前端(浏览器)发出请求
(1)url重定向 < a href="">,location.href,open(),F5刷新(只支持get请求)
(2)form表单请求 < form> 支持文件上传 (get,post请求)
(3)ajax请求 异步请求,页面不刷新 (get,post请求) -
2.web服务器接收并解析
(1)request对象 请求的全部内容
(2)response对象 回应对象 ,写入结果
(3)context对象 上下文 指定应用相关信息 -
3.指定应用处理
web.xml等配置文件 -
4.应用指定代码处理
地址解析,通过地址指定位置 -
5.读取请求,处理业务
获取request对象,增删改查 -
6.回应处理结果
html内容渲染,将结果写入response对象(能被浏览器识别的) -
7.浏览器解析回应内容,显示处理
接收到response对象的http数据,处理
web服务
tomcat nginx
端口接听:接收网络请求
http解析:把请求转为对象
应用容器:多个站点
Tomcat服务器
-
安装开发配置
2种安装方法: 1.安装版 下一步,注意端口冲突 2.解压版 绿色开发 开发设置: 1.eclipse-Windows-属性-server-runtime environment 按钮add,选择版本,设置路径+jdk,保存 注意:环境只需一套 2.Windows-show view-server窗口 点击窗口内超链接,自动创建servers项目,当前应用容器配置项目
-
设置
web.xml server.xml 端口号:默认8080 发布目录:webapps 日志目录:logs
-
目录
bin:命令目录 tomcat-juli.jar myeclipse设置时需要 startup.bat 绿色版启动服务的 Tomcat.exe 安装版窗口启动服务 conf:配置文件 lib:开发支持库 logs:日志 work:运行时的编译文件,jsp所生成的java.class文件 webapps:发布路径 ROOT文件夹:默认站点发布路径,url不需站点名称 后两个可删除,发布运行站点时自动生成
缓存清理
- 清理项目缓存,eclipse
project菜单clean
导致和未改前一样 - 浏览器缓存,前端缓存
清空浏览器历史记录
针对css,js文件无刷新 - web缓存,Tomcat发布缓存
servers/clean,文件夹删除
启动Tomcat时,自动加载全部站点,启动速度慢,启动错项目,异常联动
方法:删除servers,删除项目路径
新站点
-
创建 dynamic project,必须设置server runtime
-
目录
java resource/src java代码位置
Webcontent 站点根目录 放置页面,css,js
(1)/META-INF 站点签名(一般不用)
(2)/WEB-INF 配置文件夹,不能网站访问/lib额外jar包自动引用 /web.xml 项目配置文件
jsp
动态页面
-
编译指令
1、@page 类描述 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" isErrorPage="false"%> <%@import="java.util.List" %> isELIgnored:EL表达式支持 isErrorPage:异常处理页指定 2、@include 静态引入(生成java文件时导入) <%@include file="a.jsp" %> 3、@taglib 导入后台标签库 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> c:标签库别名 url:位置标识
-
静态脚本
-
用法
<% java代码 %> 执行java代码 <%=变量%> 输出java变量的值
行为标签
-
jsp:include 动态引用(执行时导入)
<jsp:include page="a.jsp"></jsp:include>
-
jsp:forward 请求转发(url没变)
<jsp:forward page="a.jsp"></jsp:forward>
内置对象
-
out 输出
out.write(i+"<br>");
-
request 请求对象
request.getParameter("count") //获取请求参数 request.getAttribute(key) request.setAttribute(key, value) //设置request服务器变量
-
response 回应对象
response.setContentType("text/html;charset='utf-8'"); //告诉浏览器 response.getWriter().write("1223132");
-
session 会话对象
时效:自创建开始,指定失效时间(相对于上次会话访问) 功能:记录会话信息,(连接会话,自动生成会话id),与其他会话定义的变量不能互访 使用: HttpSession s=request.getSession(); s.setMaxInactiveInterval(10); s.setAttribute("user", "admin"); s.getId(); //会话id,自动创建,会话标识 s.getCreationTime(); // 创建时间 s.getLastAccessedTime(); //最后激活时间 ${pageContext.session.id} //会话id ${sessionScope.user} //值使用
-
application 应用对象
时效:与web服务启动同效 功能:每个会话都能访问同一个,查询结果缓存,通用设置 使用:与requestScope一样,改为${applicationScope } request.getServletContext().setAttribute("list", list);
-
page 就是jsp页的this 忽略
-
pageContext 页面上下文
-
config 页面配置信息,web.xml设置
-
exception
servlet
创建使用
通常使用方法,java ee 3.0版本
@WebServlet("/textServer") //访问地址,一个项目地址唯一,否则异常
public class textServer extends HttpServlet { //继承
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//如果为get请求
response.getWriter().append("Served at: ").append(request.getContextPath()); //回应输出
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
继承GenericServlet完成全面自定义
@WebServlet("/textServer") //servlet处理核心
public class textServer extends GenericServlet {
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
//请求已进入先执行
}
}
通过web.xml设置,指定访问地址
<servlet>
<servlet-name>aaa</servlet-name>
<servlet-class>servlet.servlet1</servlet-class> //类全名
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/bb</url-pattern>
</servlet-mapping>
public class servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append("<a href='#'>威风</a>");
}
}
其他内容:MVC
回应方法:
-
直接输出html
response.getWriter().append("html内容");
-
后端url重定向
response.sendRedirect("a.jsp");
-
直接输出json串,ajax 可通过Jackson自动生成
response.getWriter().append(json字符串);
-
请求转发,中途加入数据
forward方法:替代之前全部输出 include方法:在之前输出的结果中附加 request.getRequestDispatcher("index.jsp").include(request, response);
-
使用前端模板引擎,freeMark
JSTL+EL:全面替代jsp脚本
-
jstl java通用标签库
core库 核心库 varstatus:指定变量名称,作为行状态对象使用,index,count属性 var:指定变量名称,作为循环的个体 items:循环的内容,用el表达式 <c:forEach items="${list}" var="row" varStatus="v"> <tr><td>${v.index}</td><td>${row.name}</td> </c:forEach> 判断处理,没有else,内容是el的boolean表达式 <c:if test="${v.index%2==0&&v.count>10}"></c:if> 设置变量值 <c:set target="${row}" property="name" value="123"></c:set> url重定向 <c:redirect url="a.jsp"></c:redirect> functions 函数库 sql 数据处理库 xml库 fmt 地域处理库
-
EL数据表达式-数据读取器(只有语法错误时报异常)
-
用法
${值} isELIgnored="false" 加page里
2.内部访问对象
requestScope 服务器值request,可省略 request.setAttribute("list", list); request.setAttribute("list",list); request.getAttribute("list"); sessionScope 服务器值session request.getSession().setAttribute(arg0,arg1); applicationScope 服务器值application request.getServletContext().setAttribute(arg0,arg1); pageScope 当前页变量,可省略 param 参数值获取 request.getParameter(arg0); paramValues 同名参数获取 ${paramValues.count[1]} request.getParameterValues(arg0) head http协议头 request.getHeader(arg0) response.addHeader(arg0,arg1) //回应的协议头 headValues request.getHeaderNames() cookie 客户端临时存储区域 ${cookie.username.value} 加入.value是取值,否则获取cookie对象 request.getCookies(); resquest.addCookie(cookie对象); pageContext 当前页上下文 ${pageContext .request.queryString} request.getServletContext() initParam 当前web.xml设置变量 <context-param> <param-name>aa</param-name> <param-value>111</param-value> </context-param> ${initParam.name} request.getServletContext().getInitParameter(arg0) //获取servlet内定义 在servlet内:this.getInitParameter(name)
-
cookie
1.与session区别
session服务器变量
cookie是客户端变量,存在浏览器缓存
session相对时间(上次激活)移除
cookie绝对时间移除,浏览器自动删除
session是站内全部有效
cookie是站内指定范围有效
2.每次发送请求时,将范围内的cookie全部塞入请求一起发送
3.使用:
Cookie[] cs =request.getCookies(); //获取
Cookie c = new Cookie("name", request.getParameter("name"));
c.setDomain("主机");
c.setPath("路径");
c.setMaxAge(3600*24*100);
c.setVersion(2); //版本,替换的
response.addCookie(c);
4.session会话跟踪
cookie会话记忆 JSESSIONID=。。。
url会话跟踪(有些浏览器禁止cookie)a.jsp;jsessionid=。。。。
- 总结:
<a> <form>
发送请求- jsp或servlet接受请求
- 业务处理,增删改查
- 请求转发回应
- 全部访问入口为servlet
listener监听器
-
服务状态:启动,停止;网站数据初始化
@WebListener //可使用注解替代web.xml中<listener>的设置 public class webListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { } @Override public void contextInitialized(ServletContextEvent scv) { scv.getServletContext().setAttribute(arg0, arg1); //application scv.getServletContext().getInitParameter(arg0); //获取<context-param>的值 System.out.println("web启动了"); } }
//web.xml <listener> <listener-class>listener.webListener</listener-class> </listener>
-
会话状态
public class sessionListener implements HttpSessionListener { int pos = 0; @Override public void sessionCreated(HttpSessionEvent hse) { System.out.println("sessionCreated:"+hse.getSession().getId()); System.out.println("人数:"+(++pos)); } @Override public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println("---人数:"+(--pos)); } }
//web.xml <listener> <listener-class>listener.sessionListener</listener-class> </listener>
-
请求属性
public class requestListener implements ServletRequestAttributeListener { @Override public void attributeAdded(ServletRequestAttributeEvent sae) { System.out.println(sae.getName()); sae.getServletRequest().setAttribute(arg0, arg1); } @Override public void attributeRemoved(ServletRequestAttributeEvent arg0) { } @Override public void attributeReplaced(ServletRequestAttributeEvent arg0) { } }
//web.xml <listener> <listener-class>listener.requestListener</listener-class> </listener>
filter 请求过滤器
基本用法:
@WebFilter(urlPatterns= "{/Type/index,/login/jsp}")
public class testFilter implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain fc)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) arg0;
System.out.println(req.getRequestURL());
//请求接收前
fc.doFilter(arg0, arg1); //继续请求,执行代码
//代码处理后
}
public void init(FilterConfig arg0) throws ServletException {
}
}
可使用xml配置:
<filter>
<filter-name>qq</filter-name>
<filter-class>filter.testFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>qq</filter-name>
<url-pattern>/index</url-pattern>
</filter-mapping>
加密
- MD5加密:(非可逆),改动字符,保障安全
- desc加密:(可逆),必须提供Key(8位)
- base64编码:(字符序列化)将任何数据转为字符串,并且可以转回来
验证码生成
- 内存当中生成绘图区域
- 随机数据,绘制到区域
- 图片生成字节数组
- 在response中写入字节数组
- 在session中记录随机字符
文件上传
-
前端
<form action="fileupload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"> </form>
-
后端:commons-fileupload jar插件 commons-io
-
获取服务器绝对路径:d:/项目服务发布路径/update
String filepath = req.getSession().getServletContext().getRealPath("upload");
-
生成一个128位长的全球唯一标识
UUID randomUUID = UUID.randomUUID();
请求状态号
- 200 一切成功
- 302,,304 从浏览器缓存处理,未发出请求(未发出客户端)
- 404 发出请求,没有找到目标处理代码
- 406 发出请求,请求被中断,拦截器
- 500 服务器代码处理异常
web.xml
-
welcome servlet listener filter init-param context-param
-
<jsp-config></jsp-config>
jsp通用设置 -
error-page 错误页处理
<error-page> <error-code>404</error-code> <location>/error.html</location> </error-page>
-
session-config session会话时间设置
<session-config> <session-timeout>300</session-timeout> </session-config>
java tag 自定义标签
-
标签类 public class MyTag extends TagSupport{ }
-
创建属性:定义属性+setters getters
-
重写方法:doStatrtTag() doEndTag() doAfterBody()
public int doStartTag() throws JspException { JspWriter out= this.pageContext.getOut(); out.write("<a href='"+href+"'>"+name+"</a>"); return TagSupport.EVAL_PAGE; } SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。 SKIP_PAGE 忽略标签后面的JSP内容。 EVAL_PAGE 处理标签后,继续处理JSP后面的内容。 EVAL_BODY_BUFFERED 表示需要处理标签体。 EVAL_BODY_INCLUDE 表示需要处理标签体 EVAL_BODY_AGAIN 对标签体循环处理
-
-
标签设置文件:在WEB_INF内创建tld文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.1.2</tlib-version> <jsp-version>1.2</jsp-version> <short-name>wjx</short-name> <!--标签的短名称(可以随意取) --> <uri>/WEB-INF/tag</uri> <!--位置,用于引用 --> <tag> <name>a</name> <tag-class>tag.MyTag</tag-class> <attribute> <name>name</name> <required>true</required> //必须录入 <type>java.lang.String</type> <rtexprvalue>false</rtexprvalue> <!--是否可用el表达式--> <body-content>JSP</body-content> <!--empty表示标签体内容可以为空,jsp则表示标签体内放置jsp页面元素 --> </attribute> </tag> </taglib>
-
使用
<%@taglib prefix="my" uri="/WEB-INF/tag"%> <my:a href="http://www.baidu.com" name="百度"></my:a>
annotation
-
创建:
@Documented @Target({ElementType.FIELD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Myannotation { String value(); int count() default 1; } @Target(ElementType.TYPE) //接口、类、枚举、注解 @Target(ElementType.FIELD) //字段、枚举的常量 @Target(ElementType.METHOD) //方法 @Target(ElementType.PARAMETER) //方法参数 @Target(ElementType.CONSTRUCTOR) //构造函数 @Target(ElementType.LOCAL_VARIABLE)//局部变量 @Target(ElementType.ANNOTATION_TYPE)//注解 @Target(ElementType.PACKAGE) ///包
-
使用:通过反射获取
@Myannotation(value="abc",count=3) String name; 处理 Field[] fs=this.getClass().getDeclaredFields(); for(Field f:fs) { Myannotation a=f.getAnnotation(Myannotation.class); String aa=""; for(int i=0;i<a.count();i++) { aa+=a.value(); } f.set(this, aa); }
web service 异构架通讯,跨域,跨系统
-
- soa:面向对象的架构
- soap:简单对象访问协议,xml通讯标准
- restfull:接口式开发,json通讯标准
- PRC:远程过程调用
- RMI:远程方法调用
- 服务端
-
创建类 加入@WebService
-
创建公共方法 //对外提供
-
启动服务端
@WebService public class testService { public void getStr(String name) { System.out.println("you name is:"+name); } public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:9091/Service/test", new testService()); System.out.println("service success !"); } }
-
- 客户端
-
通过地址生成客户端依赖
-
使用jdk的wsimport命令
-
改变当前文件夹到现项目的src文件夹
wsimport -p client -keep http://localhost:9091/Service/myservice?wsdl 源码 public static void main(String[] args) { // TestService sayHello = new TestServiceService().getTestServicePort(); // sayHello.getStr("sfsfs"); try { URL url = new URL("http://127.0.0.1:9091/Service/test?wsdl"); QName qname = new QName("http://server/", "testServiceService"); Service service = Service.create(url, qname); TestService sayHello = service.getPort(TestService.class); sayHello.getStr("孙菲菲"); } catch (Exception e) { e.printStackTrace(); }
-