0813 14 15 16 java ee

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
回应方法:

  1. 直接输出html response.getWriter().append("html内容");

  2. 后端url重定向 response.sendRedirect("a.jsp");

  3. 直接输出json串,ajax 可通过Jackson自动生成 response.getWriter().append(json字符串);

  4. 请求转发,中途加入数据

     forward方法:替代之前全部输出
     include方法:在之前输出的结果中附加
     request.getRequestDispatcher("index.jsp").include(request, response);
    
  5. 使用前端模板引擎,freeMark

JSTL+EL:全面替代jsp脚本

  1. 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 地域处理库
    
  2. EL数据表达式-数据读取器(只有语法错误时报异常)

    1. 用法

         ${值}    
         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=。。。。

  • 总结:
    1. <a> <form>发送请求
    2. jsp或servlet接受请求
    3. 业务处理,增删改查
    4. 请求转发回应
    5. 全部访问入口为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{ }

    1. 创建属性:定义属性+setters getters

    2. 重写方法: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 异构架通讯,跨域,跨系统
    1. soa:面向对象的架构
    2. soap:简单对象访问协议,xml通讯标准
    3. restfull:接口式开发,json通讯标准
    4. PRC:远程过程调用
    5. RMI:远程方法调用
  • 服务端
    1. 创建类 加入@WebService

    2. 创建公共方法 //对外提供

    3. 启动服务端

      @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 !");
      	}
      }
      
  • 客户端
    1. 通过地址生成客户端依赖

    2. 使用jdk的wsimport命令

    3. 改变当前文件夹到现项目的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();
          }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值