MY_Java后端学习之路

前言: 朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

也许男人会犯错 有时也会很冷漠 但是他有多落魄 也能看透你柔弱
也许有人比他好 没有那么多烦恼 可是谁能陪你到老 为你这一生祈祷

Tomcat配置

下载地址: http://tomcat.apache.org/
Mac配置教程:

  1. http://jingyan.baidu.com/article/ca00d56c549184e99eebcf1e.html
  2. http://blog.csdn.net/jimjarry/article/details/45076129
    sudo chmod 755 /usr/local/apache-tomcat-9.0.0.M13/bin/*.sh
    启动Tomcat:
    1.$ cd /usr/local/apache-tomcat-9.0.0.M13/bin
    2.$ sudo sh startup.sh
    关闭Tomcat:
    $ sudo sh shutdown.sh

IEDA之环境配置

配置教程
1.http://www.cnblogs.com/nora-xie/p/5835739.html
2.http://www.cnblogs.com/nora-xie/p/5835739.html

匿名内部类实现方法

//匿名内部类实现方法
interface Dao {
 public void add();
}

class Outer {
 public void print() {
  new Dao() {

   @Override
   public void add() {
    // TODO Auto-generated method stub
    System.out.println("添加学生");
   }
  }.add();
 }
}

public class Demo4 {
 public static void main(String[] args) {
  Outer outer = new Outer();
  outer.print();
 }
}

多线程的两种创建方式

方式一: 继承Thread

  • 1.定义一个类继承Thread
  • 2.重写Thread的run方法, 把自定义线程任务的代码放在run方法上
  • 3.创建Thread类的子类对象, 并且调用start方法开启线程

方式二: 实现Runable接口

  • 1.定义一个类实现Runnable接口
  • 2.实现Runable的run方法
  • 3.创建Runalbe实现类的对象
  • 4.创建Thread的对象, 然后把Runable的实现类的对象作为参数传递
  • 5.调用Thread对象的start方法开启线程
//1. 创建线程方式一: 继承Thread
class MyThread1 extends Thread{
 @Override
 public void run() {
  // TODO Auto-generated method stub
  for (int i = 0; i < 100; i++) {
   System.out.println(Thread.currentThread().getName() + ": " + i);
  }
 }
}


匿名内部类继承Thread创建多线程

public class Demo4 {
 public static int count = 100;
 public static void main(String[] args) {
  new Thread(){
   public void run() {
    synchronized ("锁") {
     while(count > 0){
      System.out.println("还剩下" + count + "张票");
      count--;
     }
    }
   };
  }.start();
 }
}

匿名内部类实现Runable接口

public class Demo5 {
 public static int count = 100;
 public static void main(String[] args) {
  new Thread(new Runnable() {
   public void run() {
    synchronized ("锁") {
     while(count > 0){
      System.out.println("还剩下" + count + "张票");
      count--;
     }
    }
   }
  }).start();
 }
}
//2. 创建线程方式二: 实现Runnable接口
class MyThread2 implements Runnable{
 @Override
 public void run() {
  // TODO Auto-generated method stub
  for(int i = 0; i < 100; i++){
   System.out.println(Thread.currentThread().getName() + ": " + i);
  }
 }
}

public class Demo5 {
 public static void main(String[] args) {
  //创建多线程方式一: 继承Thread
  MyThread1 myThread1 = new MyThread1();
  myThread1.start();
  //创建多线程方式二: 实现Runnable方法
  MyThread2 myThread2 = new MyThread2();
  Thread thread = new Thread(myThread2);
  thread.start();
 }
}

Java中的同步机制

出现线程安全问题的根本原因
1.存在两个或连个以上的线程共享着资源
2.操作资源的代码块必须有语句

1.同步代码块

同步代码块的格式:
synchronized(锁对象){
需要被同步的代码块....
}
同步代码块需要注意的细节

  • 1.锁对象可以是任意的对象
  • 2.锁对象必须是多线程共享的资源, 否则锁不住
  • 3.没有线程安全问题时候不要使用锁, 否则锁不住
  • 4.调用sleep方法并不会释放锁对象, 但是调用wait方法的线程就会释放锁对象

2.同步函数

同步函数的格式:
修饰符 synchroized 返回值类型 函数名(形参列表...){

}
注意:
1.同步函数的锁对象不能是任意的, 非静态同步函数的锁对象是this对象, 静态函数的多对象是当前字节码对象
2.同步函数的锁对象不能由你指定,是固定的

单例设计模式

懒汉单例设计模式( 线程安全问题的解决方案 ):

步骤:
1.私有化构造函数
2.声明本类引用类型变量, 但是不要创建对象
3.声明一个公共静态的方法获取本类的对象, 获取之前判断是否创建了本类对象了, 如果已经创建了就不要在创建直接返回即可, 若果还没有创建, 那么就先创建本类的引用类型变量, 然后返回.

public class Single1 {
 //创建私有对象, 但不引用
 private static Single1 single1;
 //创建私有构造函数
 private Single1(){
  
 }
 public static Single1 getInstance(){
  if (single1 == null) {
   synchronized ("锁") {
    if (single1 == null) {
     single1 = new Single1();
    }
    return single1;
   }
  }
  return single1;
 }
}

request的主要API

this.doPost(request,response);
    this.doGet(request,response);
    //请求行
    request.getMethod(); //获取请求方式
    
    request.getRequestURI();//获取请求URI
    request.getRequestURL();//获取请求URL
    
    request.getProtocol();  //获取请求http版本
    
    //请求头
    request.getHeader("名称"); //根据请求头获取请求值
    Enumeration enumeration = request.getHeaderNames(); //获取全部请求头名称
    while (enumeration.hasMoreElements()){
        String name = enumeration.nextElement();
        response.getWriter().write(request.getHeader(name));
    }
    
    //实体内容
    request.getQueryString();  //通过get方法获取实体数据
    request.getInputStream();  //通过post方法获取实体数据
    
    //通过参数名得到参数值
    request.getParameter("参数名");
    request.getParameterValues("参数名"); //返回一个数组
    
    Enumeration enumeration1 = request.getParameterNames();
    while (enumeration1.hasMoreElements()){
        String name = enumeration1.nextElement();
        response.getWriter().write(request.getParameter(name));
        //编码与解码
        //            name = new String(name.getBytes(iso-8859-1),utf-8);
    }

response下载图片

File file = new File("E//:a.jpg");
    response.setHeader("Content-Disposition","attachment; filename" + file.getName());
    //下载图片\
    //发送图片
    FileInputStream in = new FileInputStream(file);
    byte[] byt = new byte[1024];
    int len = 0;
    //把图片写到浏览器
    while((len = in.read(byt))!= -1){
        response.getOutputStream().write(byt,0,len);
    }

表单提交:

GET vs POST 区别

1)GET方式提交
a)地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。
b)GET提交参数数据有限制,不超过1KB。
c)GET方式不适合提交敏感密码。
d)注意: 浏览器直接访问的请求,默认提交方式是GET方式
2)POST方式提交
a)参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分割。
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 28.0px 'PingFang SC'; color: #000000}span.s1 {font: 28.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures}

b)POST提交的参数数据没有限制。
c)POST方式提交敏感数据。

JSP的9大内置对象

内置对象名          类型
request    HttpServletRequest
response      HttpServletResponse
config        ServletConfig
application        ServletContext
session         HttpSession
exception        Throwable
page            Object(this)
out             JspWriter
pageContext     PageContext

JSP标签动态设置对象属性


    
    
    
    
    

你可能感兴趣的:(MY_Java后端学习之路)