WebServer

WebServer

WEB基础

WEB-INF目录

  • 所处位置:Deployed Resources\WEB-INF
  • 作用:WEB-INF目录在服务器端不可见
web.xml
  • 查询原理:类似于外键,用于通过多个url查找同一个servlet;
  • 继承自tomcat下的web.xml,若url设置为\代表不能用
  • <url-pattern>
    • 值必须以\开头否则服务器启动不了.
    • 值不能出现错误,否则访问404.
<servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>web.HelloServlet</servlet-class> //要写Servlet完整的包名.类名
    <init-param>
        <param-name>encode</param-nam>
        <param-value>utf-8<param-name>
    </param>
</servlet>
<servlet-mapping>
 	<servlet-name>HelloServlet</servlet-name> //须和servlet标签中的配置的名字完全一致
 	<url-pattern>/hello</url-pattern>
</servlet-mapping>

应答状态码

状态码内容
200正常
302重定向
304/307使用浏览器缓存
404资源未找到
405服务器不支持当前使用的请求方式
500服务器生成响应内容出现异常(代码问题)
  • 404出现的原因

    • web.xml中没有配置servlet
    • web.sml中配置的url-pattern标签书写错误
    • 浏览器路径书写错误
  • 405

    继承了HTTPServlet方法,但是书写错取,没有重写service()方法

请求转发和重定向的区别

  • 图片

    • 请求转发

      [外链图片转存失败(img-6nI0a6ja-1563684415919)(imgs/请求转发.jpg)]

    • 重定向

      [外链图片转存失败(img-HdLW8Dfh-1563684415944)(imgs/重定向.jpg)]

  • 使用状况

    • 请求转发:传输数据
    • 重定向:定义到别的网站

SERVLET

新建servlet

  • 实现Servlet类

    右击报错,生成需要重写的方法

  • 继承HTTPServlet类

    重写service方法/或者doget()和dopost();

    右击—source–Override/Inplements—service(HttpServletRequest,);

发送代码

发送:reponse;

接收:request;

printWriter pw = response.getWriter();
pw.writer();

获取信息

  • 提交type(radio/select/)没有输入内容,不提交,java显示为null;
  • 提交内容(text/password/…)没有输入内容,传入空字符串https://v.qq.com/x/page/j00206dai30.html
String name = request.getPrarmeter("name");

表单乱码

  • POST乱码

    建议写在最前面(写在printWriter pw = response.getWriter());

    request.setCharacterEncoding("utf-8");
    
  • GET乱码

    修改Tomcat7中的conf中的server.xml(Tomcat8及以上不支持)

    添加URIEncoding=“UTF-8”(区分大小写)

    <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    

响应乱码

  • tomcat(不需要写,浏览器包括这个作用)

    response.setCharacterEncoding("utf-8");
    
  • 浏览器

    response.setContentType("text/html;chartset=utf-8");
    

重定向

相当于将页面重新发送给用户

response.sendRedirect(url);

DOA

servlet生命周期

1.实例化—初始化—就绪—销毁

  • 默认第一次访问时实例化并初始化
  • 配置下列代码的,在启动时就实例化并初始化
  • 启动多个文件时,就会启动多个service();
<load-on-startup>0</load-on-startup>//在servlet中定义
init()//运行前执行的代码
destroy()//关闭前执行的代码S
  • 2.Httpservlet
  • do get()如果是get请求的话会被执行
  • do post()如果是post请求的话会被执行
  • 或者直接重写service方法

3.ServletConfig

  • 用于读取web.xml中的内容

    ServletConfig config = getServletConfig();
    String value = config.getInitParmeter("encode");
    
  • xml的书写方式

    <init-param>
    	<param-name>man</param-name>
    	<param-value>20,25</param-value>
    </init-param
    

JSP

基础知识

  • 解析过程:

    jsp翻译成java文件,java文件编译成class文件,class会被解析成html文件

    只解析一次,服务器会保留java和class文件.

JSP代码

  • java表达式

    <%=java表达式 %>
    
  • JSP脚本片段

    <% JSP片段 %>
    

JSP指令

  • 代码

    <%@指令名 属性1="值1" [属性2="值2"] %>
    
  • 这里只学习page指令

    page指令用于指导浏览器的操作

  • import属性

    指定翻译后的类因该导入java包

    <%@page import="包名1[,包名2]" %>
    
  • pageEncoding属性

    1.规定保存jsp文件的编解码规则;

    2.为java文加添加:response.setContentType(“text/html;charset=UTF-8”);

请求转发

用户获取自己定义的数据

  • request.setAttribute("名称","信息");
    
  • 获取一个请求转发器

    RequestDispatcher rd = request.getRequestDispatcher(url);
    
    
  • 转发请求

    rd.forward(request,response);
    
    
  • request.getAttribute("名称");//返回object类型要进行强制类型转换
    
    

Cookie

  • 创建cookie

    • 创建cookie

      Cookie cookie = new Cookie("Cookie名称",数值);
      
      
    • 设置生效时间

      cookie.setMaxAge(时间);//以秒为单位
      
      
    • 设置域名

      cookie.setDomain("域名");
      
      
    • 设置路径

      cookie.setPath("路径");//默认不写是servlet父路径,path>=url
      
      
    • 发送cookie

      response.addCookie("cookie名称");
      
      
    • 字符集(编码规则)

      String value = URLEncoder.encode("数值","UTF-8");//相当与发送时输入了编码
      
      
    • 获取当前文件的父路径

      request.getContextPath()
  • 接收cookie

    • 获得cookie

      Cookie[] cs = request.getCookies();
      
      
    • 字符集(解码规则)

      String name = URLDecoder.decode("数值","UTF-8");
      
      
    • 获得数据

      String name = cs[0].getName();
      String value = cs[0].getValue();
      
      

Session

  • 流程(服务器):

    1.获取用户所有cookie

    2.查询是否有名session_id的cookie

    3.没有就创建,有查找session对象

  • 创建

    不写相当于true

    HttpSession session = request.getSession(true);//有则使用,无则创建
    HttpSession session = request.getSession(false);//有则使用,无则返回nulll
    
    
  • 绑定数据

    session.setAttribute("名称","信息");
    
    
  • 获取数据

    Object x = session.getAttribute("名称");//返回Object类型
    
    
  • 获取session_id

    session.getId();
    
    
  • 销毁

    • 自动销毁

      修改web.xml文件

      <session-config>
        	<session-timeout>15</session-timeout>
      </session-config>
      
      
    • 手动销毁

      session.invalldate();
      
      

过滤器(Filter)

  • 创建步骤

    1.开发一个filter类,实现filter类

    2.ctrl+1生成doFilter/init/destroy方法

    3.修改web.xml:创建过滤规则

    <filter>
        <filter-name>DemoFilter</filter-name>
        <filter-class>filter.DemoFilter</filter-class>
    </filter>
    <filter>
        <filter-name>DemoFilter2</filter-name>
        <filter-class>filter.DemoFilter2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>DemoFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>DemoFilter2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • 通过过滤器

    在doFilter()中设置

    chain.doFilter(request,response);
    
  • 多个过滤器同时生效时

    按照filter-mapping标签的书写顺序进行过滤

  • 生命周期

    • 实例化:加载并实例化web.xml中所有过滤器
    • 初始化:调用init();
    • 就绪:用户请求的url和当前Filter匹配时,自动调用doFilter();
    • 销毁:调用destory()方法;并在结束时。
  • fConfig方法

    • 获取web.xml配置信息

      fConfig.getInitParameter("名称");
      
    • 输出fiter-name

      Enumeration<String> it = fConfig.getInitParameterNames();
        while(it.hasMoreElements()) {
        it.nextElement();
      }
      

ServletContext

共享数据,在服务器启动时就会启动

  • 获取ServletContext对象

    一个servlet中的是相同的对象

    ServletContext sc = getServletContext();
    ServletContext sc = request.getServletContext();
    
  • 绑定数据

    sc.setAttribute("名称", object数据);
    
  • 共享配置数据

    • xml

      <context-param>
        <param-name>encode</param-name>
        <param-value>UTF-8</param-value>
      </context-param>
      
      
    • 代码

      sc.getInitParameter("名称");
      
      
  • 获取文件在服务器上的绝对路径

    sc.getRealPath("文件名");
    
    

监听器(listener)

  • 可监听的

    • 特殊事件的创建和销毁

      1.request

      2.session

      3.servletContext

    • 特殊对象中绑定/更新/删除数据

  • 创建步骤

    1.实现(对应接口)

    ServletContextListener/创建

    HttpSessionAttributeListener/添加/修改/删除

    2.ctrl+1创建方法

    3…配置web.xml文件

    <listener>
    	<listener-class>listener.MyServletContextListener</listener-class>
    </listener>
    
    

JSTL

  • El表达式

    • 语法:${}
    • 四大作用域:pageContext/request/session/servletContext
    • param.username;
    • 数组和集合:不能进行遍历
    • 可在监听器的init上创建内容,用于获取
    • 支持算数运算/逻辑运算/
  • 配置自定义标签

    1.下载JSTLmaven包

  • 语法1:

    2.<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>

    • if判断

      scope=page/request/session/application

      pageContext.setAttribute(“flag","flase”);//默认page
      <c:if test="${day==3}" var="flag" scope="page">
      	test==true输出
      </c:if>
      <c:if test="${!flag}"
            相当于else
      </c:if>
      
      
    • switch

      <c:choose>
          <c:when test="${day==1}">
      		Hello Tuesday;
          </c:when>
          <c:when test="${day==2}">
      		Hello Tuesday;
          </c:when>
          <c:otherwise>
      		Hello JSTL;	
          </c:otherwise>
      </c:choose>
      
      
    • for循环

      for(i=1;i<10;i+=2){}
      <c:forEach begin="1" end="10" step="2" var="i" [carSatus="st"]>
         ${i}
      	[st.count//次数
      	st.index
      	st.first//是否为第一个
      	st.last//是否为最后一个]
      </c:forEach>
      
      
    • 增强for循环

      <c:forEach items="${list} var="user"></c:forEach>
      
      
  • 语法2:

    2.<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>

    • 格式化数字

      <fmt:formatNumber pattern="RMB###,###,###.00" value="${price}" />
      
      
    • 格式化日期

      <fmt:formatDate value="${today}" pattern="yyyy/MM/dd" />
      
      

九大内置对象和四大作用域

对象
applicationapplicationServletContext
configpageServletConfig
exceptionpageThrow(错误页面)
outpageJSPWrite
pagepageServlet(this)
pageContextpagePageContext
requestrequestHttpServletRequest
responseresponseHttpServletResponse
sessionsessionHttpSession

java官方标签

  • jsp标签

    <jsp:useBean id="名称" class="导入包"></jsp:useBean>
    
    
  • fmt标签

    <fmt:formatDate value="${today}" pattern="yyyy/MM/dd" />
    
    

url-parren

  1. /user/listUser 一对一

  2. /user/* 一对多

  3. *.后缀 比如 *.do, list.do

  4. 匹配的优先级

    Servlet1 : url-pattern /*
    Servlet2 : url-pattern /user/listUser.do
    Servlet3 : url-pattern .do
    Servlet4 : url-pattern /user/

    请求1: /user/listUser.do ->第二个
    请求2: /user/addUser.do ->第四个

    原则:

    1. 谁最像找谁
    2. *.后缀 的 优先级 永远是最低的

    *.do

    /user/listUser.do

MVC

注解

  • 创建annotation文件–选择Runtime+Method

  • Retention(RUNTIME)

    指明当前解释保存到那个阶段

    1.SOURCE:.java

    2.CLASS:.java—.class

    3.RUNTIME:.java—.class—类加载

  • Target(METHOD)

    指明当前解释添加到那些位置

    METHOD:添加到方法上

  • 详细

    @RequestMapping("地址");
    request.getRequestURI();
    
    

反射

  • 作用:动态查看一个类的所有成员(方法,属性);
  • 代码:
  1. 获取class对象

    • 已知包类名获取类名
     Class forName = Class.forName(className);//className是String类型
    
    
    • 已知对象获取类名

    创建一个静态类,参数为Object obj

    Class cz = obj.getClass();
    
    
  2. 获取该类声明的所有属性

    ​```java
    Field[] fs = cz.getDeclaredFields();
    ​```
    
    
  3. 获取该类声明的所有方法

    Method[] ms = cz.getDeclaredMethods();
    
    
  4. 获取该方法上所有的注解

    Annotation[] ans = method.getAnnotations();
    
    
  5. 动态的创建该类的对象

    Object obj = cz.newInstance();
    
    
  6. 其他

    Method method = cz.getDeclaredMethod("listUser");
    
    
  7. 执行方法

    ​```java
    Object result = method.invoke(obj[,参数1,参数2]);
    ​```
    
    
  8. 获取某类型的注解

    RequestMapping an = method.getAnnotation(RequestMapping.class);
    
    

JDBC

mvavn包

mysql-connector-java

commons-dbcp

连接数据库

  • mysql

    show processlist;//检查当前链接数
    
    
  • 加载的是java.sql

  1. 加载驱动:

    Class.forName ("com.mysql.jdbc.Driver");//1.6之后会自动添加|java web不会添加
    
    
  2. 获取连接:

    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名",用户名,密码);
    
    

连接池

  • 作用:将连接重用,避免浪费,提高执行效率
  • 在maven中添加dbcp
  • 安装maven包dbcp/mysql-connector
  • 保证只有一个连接池,但是可以连接所个数据
  1. 创建连接池对象:

    BasicDataSource dataSource = new BasicDataSource();
    
    
  2. 设置连接池信息:

    dataSource.setDriverClassName("com.mysql.jdbc.driver");
    dataSource.serUrl("jdbc:mysql://localhost:3306/数据库名");
    dataSource.setInitialSize(3);//初始连接数量
    dataSource.setMaxActive(5);//最大连接数量
    
    
  3. 获取连接

    Connection coon = dataSource.getConnection();
    
    
  4. 释放资源

    coon.close();
    
    

执行sql语句

  1. 创建sql执行对象:

    Statement stat = conn.createStatement();//创建执行语句,并返回结果
    
    
  2. 执行sql语句

    1. 创建
    Boolean x = stat.execute(sql语句);
    
    
    1. 增删改
    int x = stat.excuteUpdate(sql语句);
    
    
    1. 查询
    ResultSet rs = stat.executeQuery(sql语句);
    while(rs.next()) {
    	String name = rs.getString("ename");
    	double sal = rs.getDouble("sal");
    	System.out.println(name+":"+sal);
    }
    
    
  • 批量执行(不适用与查询)

    1.创建sql语句
    
    sq1/sq2/sq3
    
    2.stat.addBatch(sq1);stat.addBatch(sq2);
    
    3.stat.excuteBatch();
    
    

预编译执行sql语句

好处:用于便捷的书写变量的sql值,防止sql注入;

sal注入:=’ ’ or ‘1’=’

1.创建sql语句

String str = "insert into jdbcperson value (null,?,?)";

2.创建预编译的SQL执行对象:

PreparedStatement ps = conn.PerparedStatement(sql);

3.把?换成真正的对象:

ps.setString(1,变量名);

4.执行sql语句

  • 单句执行:

    ps.executeUpdate();
    
    
  • 批量执行:

    ps.addBatch();
    ps.excuteBatch();
    
    

查询获取得到的字段值

intgetInt()
varchargetString()
float/doublegetFLoat()/getDouble()
datetime/timestampgetDate()

括号内书写字段名,或者字段名的位置(相对于查询语句处的*位置)

事务

1.关闭事务自动提交

conn.setAutoCommit(flase);

2.提交事务

conn.commit();

3.回归事务

conn.rollback();

获取自增字段

String sql1 = "insert into team values(null,?)";
PreparedStatement ps = conn.prepareStatement(sql1,Statement.RETURN_GENERATED_KEYS);
ps.setString(1,teamName);
ps.executeUpdate()
ResultSet rs = ps.getGeneratedKeys();;//获取自增的主键值
while(rs.next()) {
		teamId = rs.getInt(1);
}

文本获取

1.引入文本:

InputStream ips = java文件名.class.getClassLoader().getResourceAsStream("jdbc.properties");

2.创建properties对象:

Properties prop = new Properties();

3.引用文本:

prop.load(ips);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值