前后端交互

Day1

CSS伪类选择器

描述一个标签元素经历过状态
没有访问过的状态link
鼠标悬停状态hover
鼠标激活状态active
访问过的状态visited
​
        在css代码块中
            选择器:状态{
                书写样式代码
            }
            
在 CSS 定义中,a:hover 必须被置于 a:link 和 a:visited 之后,才是有效的。    
在 CSS 定义中,a:active 必须被置于 a:hover 之后,才是有效的。
伪类名称对大小写不敏感。

代码书写

 <style>
        /*没有访问过的状态*/
        a:link{
            /*字体尺寸样式*/
            font-size: 20px;
            color: red;
            /*文本修饰*/
            text-decoration: none;
        }
​
        /*访问过的状态*/
        a:visited{
            font-size: 35px;
            color: darkgrey;
        }
​
        /*鼠标悬停状态*/
        a:hover{
            font-size: 30px;
            color: blue;
            text-decoration: underline;
​
        }
        /*激活状态:点击但是没有松开*/
        a:active{
            font-size: 25px;
            color: greenyellow;
            text-decoration: none;
        }
​
​
    </style>
​
<div>
<a href="跳转.html">点击跳转</a>
</div>

CSS文本选择器

文本颜色:color
 
行高:line-height
​
letter-spacing:字符间距
​
text-align:设置文本内容对齐方式
  
text-decoration 属性:设置文本的是否有下划线
                overline:上划线
                underLine:下划线
                line-through:中划线
 word-spacing:单词间距
 系统认为:两个字组成一个单词           
<style>
        body{
            /*文本颜色:color*/
            color: red;
            /*行高:line-height*/
            line-height: 50px;
            /*letter-spacing:字符间距*/
            letter-spacing: 10px;
            /*text-align:设置文本内容对齐方式*/
            text-align: center;
            /*text-decoration 属性:设置文本的是否有下划线
                overline:上划线
                underLine:下划线
                line-through:中划线
            */
            text-decoration: line-through;
​
​
            /*
                word-spacing:单词间距
                系统认为:两个字组成一个单词
            */
            word-spacing: 100px;
        }
​
    </style>

CSS背景

<style>
给body中设置相关的背景样式:
​
body{
background-color:设置背景颜色
background-color: darkgrey;
​
background-image:将图像设置背景
如果这个图像尺寸大小不是当前系统默认的分辨率尺寸
这个图像就会重复复制,X轴和Y轴在同时复制
background-image: url("img/mv.jpg");
background-repeat:设置图像是否重复以及如何重复
                默认值:repeat(x轴/y轴重复)
​
                repeat-x:x轴重复
                repeat-y:y轴重复
                no-repeat: (不重复)推荐
background-repeat: no-repeat;
​
background-position:设置图像的起始位置
                   图像的位置 在浏览器中的显示位置
                   默认值:就是top left
background-position: top center;
​
推荐:背景样式的简写属性
            background:
            background-color
            background-position
            background-repeat
            background-image
            
 background: darkgrey top left no-repeat  ; 
 
}
</style>

CSS边框样式

CSS边框样式:有4个边
​
先去设置四个边的颜色:
        border-top-color: red;
        border-left-color: greenyellow;
        border-bottom-color: blue;
        border-right-color: darkgreen;
        
 1)边框四个边的颜色,宽度,以及样式都有一个默认的方向:
                上右下左
​
2)某一边没有设置颜色,宽度以及样式:会使用对边的颜色和宽度以及样式
                颜色/宽度/样式的简写属性
​
再去设置四个边的宽度
        border-top-width: 10px;
        border-left-width: 20px;
        border-bottom-width: 30px;
        border-right-width: 40px;
        border-width: 1px ;
        
要显示边框出来,必须要指定的边框的样式属性
        border-style
        solid:单实线
        double:双实线
        dashed:虚线
        dotted:点
        
    border-top-style: solid;
    border-left-style: double;
    border-bottom-style: dashed;
    border-right-style: dotted;
    border-style: solid ;
    
border的简写属性:
    border-width
    border-style
    border-color
    
 <style>
        div{

代码实现

 <style>
        div{
            border:2px solid black; //边框黑色单实线   
            width: 100px;
            height: 100px; //设置边框大小
        }
    </style>

CSS浮动属性

浮动属性:float
        left:向左浮动,碰到外边框停止浮动
        right:向右浮动...
        
不浮动属性:
        clear
        :left:左不浮动
        right:右不浮动
        both:左右两边都不浮动                        

代码实现

 <style>
​
        .c1{
            border: 1px solid #000;
            background-color: red;
            width: 200px;
            height: 200px ;
​
            /*浮动属性:float
                left:向左浮动,碰到外边框停止浮动
                right:向右浮动...
               */
            float: left;
        }
        .c2{
            border: 1px solid #000;
            background-color: greenyellow;
            width: 200px;
            height:200px ;
            float: left;
        }
        .c3{
            border: 1px solid #000;
            background-color: blue;
            width: 200px;
            height: 200px ;
            float: left;
        }
​
        /*.clear{
​
         */
​
            /*不浮动属性
                一般推荐:both:两边都不浮动
            */
        /*
            clear: both;
        }
        */
    </style>

CSS盒子模型

万物皆盒子,可以将任意html标签看成一个盒子
将任意的元素使用div包裹起来,通过选择器(id/class)控制任意元素
​
盒子具备的属性:
容量大小:给div元素包裹的内容设置width和length
​
盒子的厚度:border,当前的边框大小
盒子的内边距:padding,控制盒子的内容,和border之间的距离
盒子的外边距:margin:控制的是盒子与盒子之间的距离(使用居多,可以控制盒子进行左/右外边距进行移动)
​
padding和margin也具备边框的基本特点
默认方向:上,右,下,左
如果一边未设置,补齐对边的距离
​

Servlet

servlet 全称"server applet" 
servlet是运行在 Web服务器中的小型Java程序。
servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求。
​
定义一个serlet:
    1) 自定义一个类,继承HttpServlet
        重写HttpServlet里面doGet(),doPost方法.
    2)配置servlet:在WEB-INF的web.xml文件中配置指定的servlet
        在web.xml中配置
        
Servlet就是能够实现Servlet接口的普通类!

配置web.xml

 //配置servlet基本配置
<servlet>
//配置servlet的名称
<servlet-name>名称</servlet-name>
//配置当前MyFirstServlet的全限定名称
<servlet-class>com.qf.web.MyFirstServlet</servlet-class>
</servlet>
​
​
//servlet的映射配置
<servlet-mapping>
<servlet-name>名称</servlet-name>//名称必须要配置与servlet名称的<servlet-name>保持一致
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>

servlet中文乱码解决

// response.getWriter().write("今天天气针不戳//打印时出现乱码
//解决响应的中文乱码
response.setContentType("text/html;charset=utf-8");//使用utf-8,避免乱码
PrintWriter writer = response.getWriter();//字符打印流
writer.write("输的什么液,想你的液!!");

servlet体系结构

MyFistServlt--继承-->HttpServlet--继承-->GenericServlet--implements实现接口-->Servlet
​
Servlet接口:定义一些相关Servlet生命周期相关的方法
init(ServletConfig config)
初始化
​
service(ServletRequest request,ServletResponse response)
是web服务器解析业务方法的入口(服务方法)
​
public void destroy () : servlet的销毁方法
​
​
GenericServlet:
获取具体的ServletConfig:配置对象:获取配置参数
获取具体的全局对象:ServletContext(域对象)
域对象:实现web容器之间数据通信
域对象:实现容器之间数据通信
​
HttpServlet:
重写service方法
针对用户不同的提交方式执行不同的doXXX(doGet()doPost())
​
自定义一个类:
重写具体的HttpServlet里面
doGet()/doPost()完成我们自己的get或者post提交方式的业务!.
​
Http协议的规范规定格式
HttpServletRequest 请求对象
HttpServletResponse 响应对象

Servlet执行流程

1)用户发送Http请求---将请求的信息内容封装到HttpServletRequest(请求对象中)
​
​
​
tomcat服务器启动完成
1)解析url
工程路径名称/配置Servlet的映射路径
2)在web.xml中寻找是否存在url-pattern的内容为:/配置Servlet的映射路径
​
3)获取对应的名称<servlet-name>MyFirstServlet</servlet-name)
​
4)通过名字找到servlet的名称中是否有MyFirstServlet
​
5)配置servlet基本设置
<servlet>
//配置servlet的名称
<servlet-name>MyFirstServlet</servlet-name>
//配置当前MyFirstServlet的全限定名称
<servlet-class>(工程名称(包名.类名))</servlet-class>
</servlet>
​
​
tomcat服务器需要解析xml文件
​
dom解析(基于面向对象):dom4j的方式dom for java
使用dom解析
获取到Servlet-class标签对象,通过标签对象获取文本内容:" 工程路径名称(包名.类名)"
得到:
Class<MyFirstServelt> clazz = Class.forName ( "com. qf.web.MyFristServlet" )
0bject obj =clazz.newInstance();
​
Method = clazz.getDeclaredMethod("doGet",HttpServletRequest.class,
HttpServletResponse.class)
​
调用
m.invoke (obj, request, response) :
​
sax解析(基于事件编程)

Servlet生命周期

默认情况下对象只创建一次
初始化也只初始化一次!
而service方法,被调用多次,里面覆盖的应该具体的doXXX()方式(根据不同的提交方式执行不同的doXXX)
​
当前serlvet类对象什么时候创建?默认的时候,
访问servlet的时候创建当前类的实例,而且是单例的,在内存中始终只有一个对象
也可以通过在servlet配置中:<load-on-startup>1</load-on-startup>配置初始化时机,当前tomcat启动的时候创建当前类对象
以及进行初始化操作!
​
​
​
配置servlet初始化时机
当tomcat服务器启动的时候,就创建当前类对象数值越大,优先级越小,
1:最大优先级的
<load-on-startup>1</load-on-startup>

接收前台表单提交数据

 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
//解决post提交方式的中文乱码
request.setCharacterEncoding("utf-8");
//解决响应的中文乱码
response.setContentType("text/html;charset=utf-8");
​
 //tomcat版本8.0以上 无须手动方式解决get提交方式乱码,tomcat8以上已经get优化了
​
覆盖doGet和doPost方法的时候,两个方法处理get方式和post方式
接收前台参数数据的方式都是通用的,所以只需要在doPost将doGet()复用即可!
​
//通用方法:获取前台参数
//public String getParameter(String name):通过name属性值获取它提交的内容
String username = request.getParameter("username");
String passowrd = request.getParameter("password");
System.out.println(username+"----"+passowrd);
​
​
//public java.util.Enumeration<E> getParameterNames() :获取的所有的参数名称的内容
        //针对复选框:选多个值:默认获取的第一个值!
        Enumeration<String> en= request.getParameterNames();
        while(en.hasMoreElements()){
            String name = en.nextElement();//参数名称
​
            //public String getParameter(String name):通过name属性值获取它提交的内容
            String value = request.getParameter(name);
            System.out.println(name+"---"+value);
        }
​
    }
}
 @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
​
        //覆盖一下doGet即可
        doGet(request,response);
​
​
​
doPost方法中覆盖
覆盖一下doGet即可
doGet (request, response);

 

Day2

获取ServletConfig配置对象

ServletConfig对象:是Servlet的配置对象
​
获取ServletConfig对象:
GenericServlet:抽象的父类中:
public ServetConfig getServietConfig(){return this.config}
​
//ServletConfig:获取配置参数
ServletConfig config = this.getServletConfig();
​
//String getInitParameter(String var1);//参数名称获取参数值
String value = config.getInitParameter("web.xml文件中配置的名称");
​
​
//public java.util.Enumeration<E> getInitParameterNames():获取servlet的所有初始化参数名称
        Enumeration<String> ens = config.getInitParameterNames();
        while(ens.hasMoreElements()){
            String name = ens.nextElement();
            String v = config.getInitParameter(name);
            System.out.println(name+"---"+v);
        }
        
​
xml文件设置:
 <!--参数名称-->
     <param-name>名称</param-name>
     <!--参数值-->
     <param-value>参数值</param-value>
 </init-param>
 <init-param>
     <param-name>path</param-name>
     <param-value>d:/a.txt</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>

全局对象

ServletContext作用1

全局对象:ServletContext
每一个web应用程序都有自己的上下文:  工程名称,包含在url地址上
​
http://localhost:8080/***/***/***上下文路径
​
作用1:能加载全局配置参数 (读取一些配置文件)
​
html:超文本标记语言,
书写html标签:移动存在的标签
​
xml:可扩展标记语言(早期用来替代html语言,没有成功)(作为配置文件使用)
非常注重结构(又开始有接收)
作为小型数据库
用户可以自定义标签
特点:一个xml文件只能有一个根标签 
​
作用1:能加载全局配置文件()
​
在xml文件中配置全局参数
 <!--全局参数-->
    <context-param>
        <param-name>AAA</param-name>
        <param-value>AAA'value</param-value>
    </context-param>
    
获取:
1)通过ServletContext对象,获取全局参数
​
抽象的父类中
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
​
ServletContext context = this.getServletContext();
​
//    String getInitParameter(String var1);:初始化的全局参数
String value = context.getInitParameter("AAA");//参数名称获取参数内容
System.out.println(value);

ServletContext作用2

ServletContext:可以获取上下文路径
​
 //1)获取Servletcontext对象
ServletContext servletContext = this.getServletContext(); //全局对象
//2)String getContextPath():获取上下文路径
String path = servletContext.getContextPath();
System.out.println(path);
​
Http协议:将获取上下文路径的方法,封装在请求对象中
​
String path = request.getContextPath();
System.out.println(path);
​
​
pageContext
getReuqest()---->Request对象
request--->称为 pageContext的bean属性(javabean导航)
​
HttpServletRequest
public String getContextPath()    getXXX() ----xXX:就称为bean属性
contextPath--->称为HttpServletRequest的bean属性

ServletContext作用3

作用3:servletContext可以作为"域对象"去使用!
 
域对象:可以在不同的servlet之间进行数据共享!
与对象中通用的方法:
ServletContext:全局对象
​
将存储的obj绑定在属性名称name上,存储在web容器中
setAttribute(String name,Object obj)//给域对象中存储数据
​
getAttribute(String name)—--->0bject obj//从域对象中获取数据
​
removeAttribute (String name)//从域对象中移除内容!
​
jsp:Java Server Page(是一个模板引擎(通过特殊标签进行数据渲染))
本质就是一个Servlet
域对象:就是可以在多个Servlet之间进行数据共享!
​
​
 //获取全局对象
 ServletContext servletContext = this.getServletContext();
 //给当前域对象添加属性和内容
 //void setAttribute(String var1, Object var2);
 List<String> list = new ArrayList<String>() ;
 list.add("张三") ;
 list.add("李四") ;
 list.add("王五") ;
​
servletContext.setAttribute("list",list);//存储的属性名称 "见名知意"
System.out.println("保存成功...");
​
​
//-----
在第二个servlet中
​
 //获取全局对象
 S ervletContext servletContext = this.getServletContext();
 // Object getAttribute(String var1);//可以存储任意java类型
 List<String> list = (List<String>) servletContext.getAttribute("list");
 for(String str:list){
 System.out.println(str);
 }
 System.out.println("获取成功....");

常见的域对象:从小到大

PageContext   page域:jsp页面中使用(当前jsp页面中有效)
​
HttpServletRequest request对象(是一次请求中有效)
​
HttpSession session对象(在一次会话中有效)
​
ServletContext  application域(在整个web工程下有效)

ServletContext作用4

请求转发
原理:
​
将文件放在WEB-INF下只能通过请求转发的方式 访问,其他方式不能访问!属于服务器行为,不需要带上下文路径,只需要"/"开头带上地址
1)获取全局对象
ServletContext servletContext = this.getServletContext();
2)获取分发对象
RequestDispatcher getRequestDispatcher(String var1)
​
// 参数:客户端发送的请求 通过分发对象访问服务器的内部资源文件(servet,jsp,html)
//服务器行为:通过服务器进行内部转发  路径: 无需带(工程路径)上下文路径,需要"/"开头
​
RequestDispatcher rd =
        servletContext.getRequestDispatcher("/WEB-INF/hello.html");
//void forward(ServletRequest var1, ServletResponse var2)转发到上面的地址上
rd.forward(request,response);
HttpServletRequest
HttpServletResponse
子实现类
HttpServletRequestWrapper
HttpServletResponseWrapper       
简写方式:
在ServletRequest接口中存在一个方法:可以直接获取分发对象
RequestDispatcher getRequestDispatcher(String var1); 获取分发对象
request.getRequestDispatcher("/get.jsp").forward(request,response)

请求转发特点

两次请求的request对象是相同的一个对象(请求转发最大的特点)
​
请求转发:如果业务数据获取到了,在jsp页面使用这个业务数据就用请求转发(request作为域对象)
​
​
浏览器输入:http:/ / localhost:8080/EE_day36_war/demo3
(第一次请求)
访问url-pattern为demo3的servlet反射调用doGet()方法
1)获取分发对象:RequestDispatche
​
通过forward转发
rgetRequestDispatcher("/adv.html/xx.jsp").forward(request, response)
​
(第二次请求(服务器内转发))
web容器:分发对象请求服务器,方位adv.html
在web目录有一个adv.html,通过分发对象进行请求 ,最终相应结果

RR:Request/Resopnse

浏览器输入网址访问服务器
服务器解析数据,获取请求相关的参数数据
浏览器发送请求:request
服务器想用对象:response

浏览器规定

无论是什么浏览器,HTTP协议规定,发送信息的组成(请求行+请求头)
请求行
    请求头提交方式及  URI  Http协议版本1.1
    
请求头
key : value组成请求头:内容
user-agent:chrome谷歌浏览器
host : localhost : 8080(主机地址)
​
​
http协议规定:不同的服务器统一规范的响应内容
组成:
响应行 
    http协议版本1.1
    响应状态码
响应头  key :value组成
​
refresh:定时刷新头
        经过多少秒之后完成页面跳转
​

重定向特点

重定向:后台跳转页面的一种方式
原理:使用响应头:location,再加上一个响应的状态码:302O(表示再一次请求)
​
重定向的两次request对象不同,使用重定向一般都是仅仅作为后台跳转!
而请求转发:request对象相同,所以他有业务数据,后台跳转时是可以获取到在request域中存储的数据!
​
重定向仅用于页面跳转,重定向无法访问WEB-INF下的资源文件,
                    WEB-INF下的资源文件只能通过请求转发来访问!
​
浏览器内输入网址第一次请求(request)服务器
​
服务器端设置它的响应头location以及status:状态码
​
响应对象.setHeader("location", request.getContextPath()+" /adv.html") ;
响应对象.setStatus (302) ;
​
解析内容响应(response)给浏览器
通过浏览器查看
response Header:响应头内容
Http1.1 302
location:WEB/ adv. html  (xx.jsp)
​
浏览器获取服务器响应的参数:302以及locaiton会再一次发送请求,请求当前项目下的adv.html
此时会再次请求服务器,(第二次请求(request))此时两次的request不一致了
​
重定向仅用于页面跳转
​
服务器响应成功(adv.html状态码:200)3
​

 

重定向原理(属于浏览器行为:需要带上下文路径)
设置响应头:location头
void setHeader(String var1, String var2);
 // response.setHeader("location",request.getContextPath()+"/adv.html");
     //设置响应状态码
     // void setStatus(int var1);
     response.setStatus(302); //再次发送请求*/
        
//优化:
    //在响应对象:ServletRseonse中
    //void sendRedirect(String var1) throws IOExceptio
    response.sendRedirect(request.getContextPath()+"/adv.html");//动态获取文件

响应头

响应头:
    定时刷新头:refresh
    有定时刷新和经过多少秒后进行页面跳转
//response.setHeader("refresh","3");//每3秒页面刷新
​
//经过多少秒后进行页面跳转
response.getWriter().write("注册成功!3秒后跳转主页");
        response.setHeader("refresh","3;"+request.getContextPath()+"/index.jsp");

注解

注解的本质就是一个接口:interface
    当前接口中的方法名----在注解中叫属性"
​
使用注解就不能使用xml文件
​
jdk提供很多内置注解,内置注解中会使用到一些元注解
​
@Override: 标记某个方法是否是否重写的方法(重写的类还是重写接口的方法)
@Deprecated:标记某个方法是否是过时的
@FunctionalInterface :标记某个接口是否是函数式接口
@SuppressWarnings:压制警告  (项目部署上线的时候:代码不能出现黄色警告线问题)
 
内置注解中会依赖于元注解
@Target:标记当前内置注解能够在哪个范围上使用
public @interface Target {
 
             ElementType[] value();        返回值类型:枚举数组
             ElementType:    枚举规定的范围
             TYPE,       类/接口上使用
             FIELD,      成员变量上使用
             METHD       成员方法上使用
         }
​
@Retention:规定的注解的保留阶段(三个阶段)
public @interface Retention {
        RetentionPolicy value();
 }
 
 RetentionPolicy:枚举
         SOURCE, 编译阶段
         CLASS,  类的加载阶段
         RUNTIME 运行阶段   (我们自定义注解的时候:考虑运行阶段)
         
         
 @Documented:文档相关的注解        
         
注解中的属性----接口的方法名
 
      定义注解中的属性的类型可以分为哪些?
 
               String类型
枚举类型
              注解类型
               以上类型的数组方式
注意事项:
    如果当前注解有且仅有一个属性的时候,并且名称value,那么给value属性是可以省略名称value,直接返类型赋值

解析自定义注解

jdk提供的内置注解或者他们依赖的元注解 或者开发者自定义的注解都继承自己公共接口 Annotation
​
//使用注解优化:好处将相关的属性信息定义在注解中---通过反射执行
//如何解析自定义注解呢?反射的方式完成
//注解作用在哪个类上,获取当前字节码文件对象
​
/解析注解
//Class类中public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
//参数为:当前注解类型的字节码文件对象
//返回值:相当于获取到了MyAnnotation注解(接口)获取子实现类对象
​
MyAnnotation myAnnotation = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class);
String className = myAnnotation.className(); //调用方法(注解中的属性)
String methodName = myAnnotation.methodName();
​
//通过Class.forName(className)
Class myClazz = Class.forName(className);
//System.out.println(myClazz);//class com.qf.annotation_05.Student
//直接创建该类实例
Object obj = myClazz.newInstance();
//        System.out.println(obj);
​
//myClazz获取成员方法Method
Method method = myClazz.getMethod(methodName);
//调用
method.invoke(obj) ;

jsp脚本注释

jsp脚本注释 是不会被解析的
而html注释:是会被解析
jsp:Java Server Page :Java服务页面(能够书写java代码的html页面)
​
jsp应用场景:主要通过servlet获取业务数据,在jsp做数据展示的!
​
jsp经历两个阶段           ----- 由web容器来完成
    1)翻译阶段
            hello.jsp----->翻译成hello_jsp.java文件
​
    2)编译阶段
            hello_jsp.java---->通过jvm 进行编译hellDo_jsp.class

 

Day3

page指令

 属性:
 
<%@ page contentType="text/html;charset=UTF-8" language="java"  pageEncoding="UTF-8"
         isELIgnored="true"  session="true" autoFlush="true"   import="java.util.*"  buffer="8kb" %>
         
         contentType:指定响应的编码格式
         language:jsp支持java语言
         buffer:缓冲区大小 默认指定8kb  (需要给浏览器写入内容)
            需要借助流对象:JspWriter
         import:导入相关的包
         session:
            true:表示已经存在会话了 (自己使用:true)
            false:(不是禁用会话),阻止jsp和后台servlet之间针对没有产生用户的会话
            高流量的网站,session设置为false,可以大大节省的服务器的内存空间!
​
            autoFlush:true 开启自动刷新
            isELIgnored:是否忽略el表达式
                            true(忽略)
                            false:不忽略   
            pageEncoding:当前页面编码格式
jsp注释
HttpSession:域对象﹑浏览器和服务器之间的产生的会话存储起来(用户相关的信息)setAttribute ( "name","张三")
​
获取HttpSession:
​
​
web容器servlet--提供注解:@WebServlet
​
​
loadOnStartup:配置servlet初始化时机数字越大优先级越小
​
当前注解中的属性name指定 serlvet-name ,可以省略不写,默认当前类名
 urlPatterns:指定映射路径  数组:一般指定一个路径即可!
               /user/login
               /user/register
 loadOnStartup:配置servlet初始化时机  数字越大优先级越小
​
//@WebServlet(urlPatterns = "/servletDemo")
@WebServlet(value = "/servletDemo")
​
​
​
//创建session
//如果第一次使用:就是创建
public HttpSession getSession():创建session
HttpSession session = request.getSession();
//存储内容
session.setAttribute("name","张三");
​
//Session的范围比request范围: 在一次会话中有效!

includ指令

inlucde指定:静态包含
用法:<%@ include file="路径.jsp"%>
​
file可以包含任意的jsp页面:
    公共jsp页面被其他页面共用的时候,就可以使用静态包含(不会将被包含进来的jsp页面单独进行翻译和编译)
    特点:
        节省内存空间
        只是将被包含的jsp页面的内容加载进来!
        共用的导航栏以及底部导航栏都可以使用@include指令静态包含

targlib指令

 1)导包:
     jstl核心包 :jstl-1.2.jar
     standard-1.1.2.jar 标准包
 2)在jsp页面上使用targlib指令
     <%@targlib prefix="c" uri="" %>
     <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3)就可以使用c标签
    c:标签名称   
4)前提条件要使用核心标签库,--->使用el表达式
    el表达式${}替代jsp输出表达式
 //给request域对象中存储String数据  <%%>
 
// 输出表达式获取request域对象存储的数据  <%= %>
​
​
/给request域对象中存储String数据
pageContext.setAttribute("user","张三");
request.setAttribute("user","admin");       //相当于给Map集合中添加key,value
session.setAttribute("user","杨德财") ;
application.setAttribute("user","高圆圆");
String username = (String) request.getAttribute("user");  
​
​
 ${域对象.属性名称}
  //   域对象:
         el中使用域
         内置对象
         pageScope          page域                   pageContext
         requestScope       request域                HttpServletRequest
         sessionScope       session域                HttpSesison
         applicationScope   application域            ServletContext
         
// 通过域对象.属性即可    本质就是返回Map集合
​
${requestScope.user} //指定域访问属性
​
${user}  //不指定域,谁小谁先访问
//在${el内置对象.属性名称} 优化,不需要书写域对象
//不需要书写内置对象      直接这样写
//${属性名称}
//在四个域对象中搜索哪一个域对象中绑定了user属性---获取内容,谁小谁先取到
//---->findAttribute(String name)

javaBean

javaBean是一种规范:
1)当前类是一个具体类
2)有私有字段private修饰
3)提供setXXX()getXXX()方法
4)当前类如果需要在网络中传输,实现序列化接口:serializable
//jsp页面中:javabean导航
//通过el表达式 可以直接调用getXXX()方法
//XXX---称为当前类的bean属性
​
//getXXX() 获取内容的/setXXX()赋值的
// el表达式: ${域对象中存储属性.xXX}
​
 el表达式来操作 javabean属性
 
 //创建User对象
 User user = new User() ;
​
//赋值
user.setUsername("高圆圆");
user.setPassword("123456");
//将user对象存储request域中
request.setAttribute("user",user);
​
<%--通过el表达式操作bean属性
 ${user}  ---->    (User)(request.getAttribute("user")) ---->User
--%>
${user.username}  -  ${user.password}

核心标签库

-导入taglib指令uri="jstl的核心库core"
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
​
c:if标签 提供判断逻辑使用
    test属性
            使用${}判断     如果结果为true,则执行c:if语句体;否则不执行
​
    c:if标签针对某种条件进行判断,没有c:else标签;如果需要在判断:在使用c:if
<%
    User user = new User() ;
    user.setUsername("zhangsan");
    user.setPassword("123456");
​
    //request域对象中
    request.setAttribute("user",user);
%>
    <c:if test="${user.username.equals('zhangsan')}">
        用户名一致
    </c:if>
    <c:if test="${!user.username.equals('zhangsan')}">
            对不起,用户名存在问题
</c:if>

c:choose

 核心标签库中提供 选择结构语句
    c:choose
    c:when  test="${xxx}"      匹配结果
    c:otherwise:上面c:when都不匹配的结果
    <c:choose>
        <c:when test="">
​
        </c:when>
        <c:when test="">
​
        </c:when>
​
        <c:otherwise>
​
        </c:otherwise>
    </c:choose>
    
<%
    int number = 5 ;
    //给request域对象中存储了number值
    request.setAttribute("number",number);
%>
​
<c:choose>
    <c:when test="${number==1}">星期一</c:when>
    <c:when test="${number==2}">星期二</c:when>
    <c:when test="${number==3}">星期三</c:when>
    <c:when test="${number==4}">星期四</c:when>
    <c:when test="${number==5}">星期五</c:when>
    <c:when test="${number==6}">星期六</c:when>
    <c:when test="${number==7}">星期日</c:when>
    <c:otherwise>
        <strong>对不起,非法数据!</strong>
​
    </c:otherwise>
</c:choose>

c:foreach标签

方式1

c:foreach标签两种用法
普通方式:
    类上于java代码普通for循环的格式
​
        属性:
        begin:当前起始角标
        end:结束角标(包含结束角标值的)
        step:步长语句
        var:循环中的变量名
        varStatus:循环中的状态
        varStatus="status"
​
        status.index:访问角标(从0开始)
        status.count: 序号:从1开始
脚本代码内不能写标签
<c:forEach begin="0" end="10" var="i" step="1" varStatus="status" >
        <%--
        取值:el表达式
        --%>
        ${status.count}  -  ${i}  <br/>
</c:forEach>
    
begin:从0开始
end:到10结束
var:变量i
step:每次+1
varStatus:循环状态,序号

方式2

跟业务相关的使用方式:  需要从后台获取域对象中存储的数据
items属性:
    c:foreach
        items = "${list}"   var :循环中的变量
        varStatus:循环中的状态
<%
        //创建List集合
        List<String> list = new ArrayList<String>() ;
        //添加数据
        list.add("JavaEE") ;
        list.add("Python") ;
        list.add("Web") ;
        list.add("C") ;
​
        //将list集合存储到request域中
        request.setAttribute("list",list);
%>
​
<c:forEach items="${list}" var="p" varStatus="status">
​
    ${status.count} - ${p}  <br/>
</c:forEach>

MVC:架构设计思想

M:Model数据模型(业务模型数据)
v : View视图
C:Controller:控制器
​
​
实体类--—-->entity/domain/pojo
控制器放置包--->web/controller
业务模型
    业务接口层:--->service
    业务接口实现层---->service.impl
数据库访问接口层---->dao
数据库访问接口实现层---->dao.impl
工具类---->dao.utils/common
​
​
1)浏览器访问服务器:展示登录页面
用户输入用户和密码,需要表单提交form action="后台地址”
​
controller/web
2)xxxServlet            AdminServlet 
接收用户相关的信息用户名和密码
调用service层通过方法查询
​
将用户可以存储在域对象中 HttpSession(用户名放在session中)
请求转发到jsp页面上
​
​
3) service
    UserService接口
        User findUser(用户的数据);
​
4)service.impl
    UserServiceImpl
        User findUser(String name,String password){
        //调用dao层:数据库访问层
        (在service调用AdminServlet,service通过User findUser(用户的数据);接口实现  )
​
        业务层调用User selectUserByUserName
                    (String name,String password);,业务层返回结果
}
​
5)dao数据库访问接口
    UserDao
    User selectUserByUserName(String name,String password);
    
    dao.imp1接口实现层UserDaoImpl
    User selectUserByUserName (String name,String password){
    
    //原生JDBC操作
    //apache的开源工具库去操作
    return user;
​

Day4

UUID

UUID: java.util一个工具可以每次产生一个随机的字符:每次产生32个字符
randomUUID():产生一个唯一标识符
UUID uuid = UUID.randomUUID();
String string = uuid.toString();
System.out.println(string);  //每次输出的都不一致(是唯一的):
                        //ff77aa0a-766b-4799-9f77-780b991fb436
​

响应式属性

添加响应式属性:
防止浏览器分别尺寸不断的进行变化,内容不会紊乱(自动适应屏幕分辨率)
<div class="table-responsivet>
    <table class="table">
    ...
    </table>
</div>
​

禁用超链接跳转

禁用掉javascript : void(O)
<a href=" javascript:void(0)" ><a/>

Maven

Maven:是一款项目管理工具软件
通过一小段信息描述:管理jar文件(一个jar包:存储很多核心第三方类以及接口...)

配置环境变量

在环境变量里添加MAVEN_HOME,
path中添加%MAVEN_HOME%\bin
​
配置完成后在dos窗口查看maven版本:mvn -ersion
​
可以针对某个maven项目进行清除,编译,打包.安装部署
​
mvn-clear(清除之前的项目)
mvn -compile(重新编译)
mvn -package(打包)
mvn -install(安装)
mvn -deploy(部署)
​
idea/eclipse开发工具:对maven工具软件/git/svn都集成好了
                            git和svn(版本控制工具)代码的版本
​
​
有了maver还需要下载本地仓库

maven的conf目录配置

打开conf目录中的setting. xml
​
1)需要关联本地从仓库地址
在<settings>下添加
<!--本地仓库配置-->
<localRepository>repository_personal文件地址</localRepository>
​
2)配置ailiyun的仓库
如果maven项目关联的jar包本地仓库如果没有aliyun的仓库下载
<!--配置alimaxen镜像--><mirror>
        <id>alimaven</id>
            <name>aliyun maven</name>
            <url>https : //maven.aliyun.com/repository/public</ur>
            <mirrorOf>central</mirrorOf>
        </mirror>   
​
3)配置maven内部的编译环境
<!--maven编译环境-->
     <profile>
      <id>jdk-1.8</id>
      <activation>
      <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
      <repositories>
        <repository>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </repository>
      </repositories>
    </profile>


maven项目中:如果配置好了本地仓库地址
就可以pom. xml
<!--导入依赖的jar包--><dependencies>
导入本地仓库中相关的jar包用谁导入谁
</dependencies>

maven与普通的web工程有什么区别?

普通的web工程
src:放置原码
web目录:存放资源文件
WEB-INF
web. xm1当前web工程的全局配置文件
导入的第三方的jar包
弊端:
1)随着项目不断的进行扩展, jar包会越来越多,造成web工程内存越来越多
2)当前jar包版本更新了,需要将原来的jar包解绑,然后在重新绑定新的jar包项目下维护起来麻烦!


idea创建maven项目大大节省内存空间,而且jar包的版本事新便于维护idea创建maven项目
网络条件好的话创建maven是可以选择在线骨架,也可以不选择后期手动补全项目结构
​

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值