JavaWeb
一、JDBC
1.JDBC的基本使用和封装
-
1、JDBCUtils工具类
//JDBC工具类 public class JDBCUtils { //从配置文件中读取数据库的连接信息 public static final String DRIVERCLASS = ResourceBundle.getBundle("jdbc").getString("driverClass"); public static final String URL = ResourceBundle.getBundle("jdbc").getString("url"); public static final String USERNAME = ResourceBundle.getBundle("jdbc").getString("username"); public static final String PASSWORD = ResourceBundle.getBundle("jdbc").getString("password"); //1.数据库连接方法 public static Connection getConnection() throws SQLException, ClassNotFoundException{ Class.forName(DRIVERCLASS); Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD); return conn; } //关闭数据库连接 public static void closeDB(ResultSet rs,Statement st, Connection conn,PreparedStatement ps){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(st != null){ try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
1.2、数据库库信息维护
在src目录下创建一个jdbc**.properties** 配置文件,内容如下:
driverClass=cm.mysql.jdbc.Driver
url=jdbc:mysql://loocalhost:3306/数据库名
username=root
password=root
1.3、操作类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.wuxiuxiang.tool.JDBCUtils;
//JDBC运行类
public class JDBCDemo {
public static void main(String[] args) {
//提升变量的作用域
Connection conn = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps = null;
try {
//注册驱动并连接驱动
conn = JDBCUtils.getConnection();
//获取操作sql语句对象
st = conn.createStatement();
//执行sql语句
//增加一条数据
String sql = "insert into city values (5,'黄平','贵州')";
int num = st.executeUpdate(sql);
if(num > 0){
System.out.println("数据插入成功!");
}
//执行查询语句
String sql2 = "select * from city";
rs = st.executeQuery(sql2);
//遍历,打印结果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String province = rs.getString("province");
System.out.println("id:" + id + ";name:" + name + ";province:" + province);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
JDBCUtils.closeDB(rs, st, conn, ps);
}
}
}
二、Tomcat(需配置JDK才能正常使用)
1.目录结构
1)bin:用于存放Tomcat的可执行文件和脚本文件(扩展名为bat的文件),如tomcat7.exe、startup.bat。
2)conf:用于存放Tomcat的各种配置文件,如web.xml、server.xml。
3)lib:用于存放Tomcat服务器和所有Web应用程序需要访问的JAR文件。
4)logs:用于存放Tomcat的日志文件。
5)temp:用于存放Tomcat运行时产生的临时文件。
6)webapps:Web应用程序的主要发布目录,通常将要发布的应用程序放到这个目录下。
7)work:Tomcat的工作目录,JSP编译生成的Servlet源文件和字节码文件放到这个目录下。
2.启动程序:startup.bat
3.关闭程序:shutdown.bat
4.访问Tomcat
- http://localhost:8080
- http://127.0.0.1:8080
5.Dos端口号查询指令:netstat -ano
6.修改Tomcat端口号
配置文件:tomcat/conf/server.xml,修改8080的值,如下
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
三、HTTP
Post和Get
1) POST传输数据大小无限制,get最多可传递1KB的数据
2)POST比GET请求方式更安全
响应状态代码
四、Servlet
生命周期
init():Servlet被创建后,然后调用init方法进行初始化(多次访问只调用一次init)
service():每次访问servlet时都会调用service方法
destroy():当服务器关闭时,servlet实例被销毁,就会调用该方法
doget()和dopost()
PS:当访问该servlet时会首先调用HttpServlet中service方法,service方法中做了相应的判断处理,如果请求方式是get会调用doGet,请求方式使post会调用doPost方法
ServletConfig和ServletContext的应用
- ServletConfig接口(封装了servlet的配置信息)
//获取ServletConfig对象
ServletConfig config = this.getServletConfig();
//获取参数名为data对应的参数值
String str = config.getInitParameter("data");
- ServletContext接口(封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享)
- getInitParameterNames():获取参数名
- getInitParameter(String name):获取参数值
//获取servletcontext对象
ServletContext context = this.getServletContext();
//获取address的值
String str = context.getInitParmeter("address");
请求乱码
- get请求乱码解决方法
//编码
username = URLEncoder.encode(username, "ISO-8859-1");
//解码
username = URLDecoder.decode(username, "utf-8");
简写式:
username = new String(username.getBytes("ISO-8859-1"),"utf-8");
案例:
//获取用户名
String un = request.getParameter("username");
//解决请求乱码(这部分可以写简写式)
un=URLEncoder.encode(un,"iso-8859-1");
un=URLDecoder.decode(un,"utf-8");
//打印结果
System.out.println(un);
-
post请求乱码解决方法
设置服务器解码的字符集为utf-8
//注意:该行代码要写在最前面 request.setCharacterEncoding("UTF-8");
案例:
//设置服务器解码的字符集为utf-8 request.setCharacterEncoding("utf-8"); //获取用户名 String un = request.getParameter("username"); //打印结果 System.out.println(un);
响应乱码
-
发送响应消息体相关方法(它们之间互相排斥,不可同时使用)
- 字节输出流:getOutputStream()方法
- 字符输出流:getWriter()方法
-
字节流乱码解决方法
思路:
<1>将字符编码成字节的字符集设置成GBK
<2>将浏览器解码字节流的字符集设置成GBK
编码与解码的字符集保持一致,因此就不会乱码。
//1.设置浏览器打开文件时的解码的字符集 response.setHeader("Content-Type", "text/html;charset=GBK"); //获取字节输出流 OutputStream os = response.getOutputStream(); //将字符串编码成字节数组(使用的字符集为平台默认字符集) String s1 = "恭喜您,登录成功"; //输出中文时将字符编码成字节的字符集 byte[] bytes = s1.getBytes("utf-8"); //将字节数组输出到响应流中 os.write(bytes);
-
字符流乱码及解决方法
方法1:
1.设置response缓冲区的编码的字符集为GBK
response.setCharacterEncoding(“GBK”);
2.设置浏览器打开文件所采用的解码的字符集为GBK
response.setHeader(“content-type”, “text/html;charset=GBK”);
response.setCharacterEncoding("utf-8");//1.设置缓冲区编码字符集 response.setHeader("content-type","text/html;charset=utf-8");//2.设置浏览器打开的解码字符集 //得到一个字符输出流 PrintWriter writer = response.getWriter(); writer.print("恭喜您,登录成功");
方法2(推荐使用该方法):
告知服务器使用utf-8编码,同时也告知浏览器使用utf-8进行解码
response.setContentType("text/html;charset=utf-8");
五、转发、重定向
转发(相对用的较多)
-
概述:在服务器内部跳转,浏览器的地址并不发生改变,并且浏览器并不知道服务器内部发生了跳转,整个过程只会发生一次请求
-
使用对象:request
-
使用转发从servletdemo1跳转到1.html页面
request.getRequestDispatcher("/1.html").forward(request, response);
重定向
-
概述:浏览器地址发生改变,浏览器知道发生了跳转,整个过程会产生两次请求
-
使用对象:response
-
使用转发从servletdemo1跳转到1.html页面
response.sendRedirect("/项目名/1.html");
六、Cookie
-
一次会话结束后,默认会清空cookie中数据
-
入门程序:
//创建cookie对象 Cookie c1 = new Cookie("username","wu");//cookie的值不能为中文 //设置cookie的有效时间为2分钟 c1.setMaxAge(2*60); //将cookie添加到响应中返回给浏览器 response.addCookie(c1);
-
getCookies()方法:获取请求中的所有cookie对象,以数组方式存储,如果没有,则返回null
//获取cookie对象 Cookie[] cookies = request.getCookies(); //如果哦没有Coookike if(ckies == null){ System.out.println("该请求中没有cookie对象") }
-
getName():获取cookie对象名称
-
getValue(String Name):获取cookie中的值
-
向浏览器以字符流输出信息:
response.getWriter().print("内容");
七、Session
-
session对象常用方法
1)存值:setAttribute(String key,Object obj); 2)取值:Object obj =getAttribute(String key); 3)移除:removeAttribute(String key); 4)得到session的id(JESSIONID对应的值): getId(); 5)设置session的生命时长:setMaxInactiveInterval(int interval) 6)销毁session: invalidate();
-
案例1:创建session对象,并再session对象中存值
//创建session对象 HttpSession session = request.getSession(); //往session对象中村值 session.setAttribute("username","彭于晏"); //设置session对象的生命时长(默认范围为一个会话) session.setMaxInactiveInterval(10);
-
案例2:获取session对象中的数据,并销毁session
//创建session对象 HttpSession session = request.getSession(); //获取session对象的id String id = session.getId(); //获取session对象中的值 String str = (String) session.getAttribute("username"); //销毁session session.invalidate();
-
域对象:
-
用来在一定范围内存数据和取数据。
-
域对象都有2个方法:
setAttribute(String name, Object value) //存数据 getAttribute(String name) //取数据
-
JavaWeb四大域对象:
//作用范围从小到大 pageContext:作用范围仅限于当前jsp页面 request:作用范围仅限于同一个请求 session:作用范围仅限于一次会话 application:作用范围限于当前WEB应用
-
八、JSP
1、JSP入门
-
定义:建立在Servlet规范之上的动态网页开发技术
-
JSP三大脚本元素
-
JSP程序代码
-
作用:写java代码
-
声明的变量是JSP页面的局部变量
-
代码放在servlet中的jspService()方法中
<% JAVA代码 %>
-
-
JSP声明语句
- 作用:声明变量和方法(全局属性)
- 被声明的Java代码将被编译到Servlet的jspService()方法外
<%! JAVA代码 %>
-
JSP表达式
- 作用:将程序数据输出到客户端(浏览器)
<%= 变量/表达式 %>
-
-
JSP注释
//方式1 <!-- --> //方式2 <%-- --%>
2、page、include、taglib三种指令
-
语法格式:<%@ 指令元素 属性名1=属性值1 属性名2=属性值2 …… %>
-
page指令
-
作用:对页面的某些特性进行描述
-
使用:<%@ page 属性名=属性值%>
-
常用属性
import //导包 session //使用session对象,默认为true isErrorPage //设该页面为错误处理页面,默认为false errorPage //指定一个错误页面 //导包案例 <%@ page import="java.util.*"%> //指定错误页面案例 <%@ page errorPage="demo.jsp"%>
-
-
include指令
-
作用:指定插入到JSP页面目标位置的文件资源
-
使用:<%@ include file=“文件路径”%>
-
案例:在当前jsp页面中插入另一个jsp页面
<%@ include file="include/demo1.jsp"%>
-
-
taglib指令
-
作用:导入标签库
-
案例:导入jsp标准标签库JSTL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!-- JAVA来实现 --> <% if(true){ } %> <!-- jsp标签来实现 --> <c:if test=""> </c:if>
-
3、JSP的九大隐式对象
-
九大隐式对象:
- out:用于页面输出
- request:得到用户请求消息
- response:服务器向个好的的回应消息
- config:获取服务器配置
- session:保存用户信息
- application:所以用户的共享信息
- page:指当前页面转换后的Servlet类的实例
- pageContext:jsp的页面容器
- exception:表示jsp页面所发生的异常,在错误页中才起作用
-
out对象
<% out.write("欢迎访问本站!") %>
-
request对象
<!--存值--> <% request.setAttribute("name","王俊凯") %> <!--取值--> <%= request.getAttribute("name") %>
-
response对象
<!--存值--> <% response.setAttribute("name","王俊凯") %> <!--取值--> <%= response.getAttribute("name") %>
-
config对象
<% ServletContext context = config.getServletContext()%>
-
session对象
<!--存值--> <% session.setAttribute("name","王俊凯") %> <!--取值--> <%= session.getAttribute("name") %>
-
application对象
<!--存值--> <% application.setAttribute("name","王俊凯") %> <!--取值--> <%= application.getAttribute("name") %>
-
exception对象
前提:必须将Page指令的isErrorPage属性设置为true。(isErrorPage=“true”)
<%= exception.getMessage() %>
-
pageContext(page域对象)
<!--存值--> <% pageContext.setAttribute("name","王俊凯") %> <!--取值--> <%= pageContext.getAttribute("name") %> <!--获取其他对象(了解)-->
九、JavaBean
- JavaBean的规范:
- 类必须是公共的、具体的
- 它的所有属性必须私有的
- 它的所有属性必须私有的
- 它必须具有一个公共的、无参的构造方法
- 为每个私有属性xxx提供公共的set方法和get方法,让外部类设置和获取JavaBean的私有属性。
十、EL表达式
- 作用:获取Servlet域对象中存储的数据
- 语法:${表达式}
1、运算符
-
点运算符(.)
-
访问对象的属性,JavaBean对象、List集合、Array数组、Map集合等
<!-- 访问session对象中的name属性 --> ${session.name}
-
-
方括号运算符([ ])
-
与点运算符的功能相同,可以获取属性名中包含一些特殊符号
<!-- 访问session对象中的name属性 --> ${session[name]} <!-- 访问arr数组中的第2个元素 --> ${arr[1]}
-
-
特殊的算术运算符
- div:除
- mod:取模
-
比较运算符
- 和Java一样
- 用字母表示:eq等于、ne不等于、lt小于、gt大于、le小于等于、ge大于等于
-
逻辑运算符
&&或and || 或 or ! 或 not
-
empty运算符
-
作用:判断某个对象是否为null或” ”,返回值为Boolean类型
<!-- 判断name变量是否为空 --> ${empty name}
-
-
条件运算符
- 相当于java的三元表达式
<!-- A式成立,则返回B,否则返回C --> ${A?B:C}
2、EL隐式对象
-
作用:
1)EL表达式能够获取四大域对象中存储的数据,根据域对象的范围从小到大在域对象中查找。
2)获取JSP其他8个隐式对象,并调用这些隐式对象中的方法
-
pageContext对象:获取JSP页面的隐式对象
-
实例:pageContext对象用于获取response对象中的characterEncoding属性
${pageContext.request.contextPath}
-
-
param对象:用于获取请求参数的某个值
-
实例:获取网页表单输入的密码
${param.password}
-
-
paramValues对象:获取请求参数的所有值
-
实例:获取网页多选框(name=“data”)的第一个值
${paramValues.data[0]}
-
十一、JSTL
- 定义:由5个不同功能的标签库共同组成的,分别为:Core、I18N、SQL、XML、Functions
- 下载JSTL包:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 压缩包:jakarta-taglibs-standard-1.1.2.zip
- 安装JSTL:将jstl.jar和standard.jar这两个文件复制到项目的lib目录下
1、Core标签库
-
<c:out>标签:向页面输出一段文本信息
<!--使用java输出信息--> <% out.write("hello") %> <!--使用标签输出信息--> <c:out value="hello"/>
-
<c:set>标签:用于设置变量值和对象属性
<!--创建变量name,值为“吴之谦”,作用域为session对象--> <c:set var="name" value="吴之谦" scope="session"/> <!--取值--> <c:out value="${sessionScope.name}"/>
-
<c:if>标签:判断表达式的值,如果表达式的值为 true 则执行其主体内容
<!--如果变量num等于0,则输出“条件成立”--> <c:if test="${num eq 0}"> 条件成立 </c:if>
-
c:choose标签:类似Java的 if-else if - else语句
<!--如果变量x等于A则输出A,如果变量x等于B则输出B,否则输出C--> <c:choose> <!--条件1--> <c:when test="${x eq A}"> <c:out value="A"/> </c:when> <!--条件2--> <c:when test="${x eq B}"> <c:out value="B"/> </c:when> <!--其他情况--> <c:otherwise> <c:out value="C"/> </c:otherwise> </c:choose>
-
c:forEach标签:用于迭代集合对象中的元素,如Set、List、Map、数组等
十二、Filter过滤器
- 概念:filter过滤器它是javaWeb的三大组件之一,狭义的Filter是指Java语言实现的一个接口,广义的Filter是指实现了这个Filter接口的类。 作用:拦截请求,过滤响应。
- 使用场景:控制权限、控制编码方式、过滤敏感词汇等
- 生命周期:
- init()方法:在Web应用程序加载的时候调用
- doFilter()方法:只要有客户端请求时就会被调用
- destroy()方法:在Web应用程序卸载的时候调用
1、过滤Servlet类
-
创建将要被过滤的servlet类
package com.gzeic.p1; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class servletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("访问了servletDemo1"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
-
创建Filter过滤器
package com.gzeic.p1; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class MyFilter implements Filter { public void init(FilterConfig arg0) throws ServletException { System.out.println("调用了init方法。。。"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //过滤器拦截处理 System.out.println("调用了doFilter方法。。。"); //放行 //一定要调用chain.doFilter(request,response)程序才能继续往下走。 chain.doFilter(request,response); } public void destroy() { System.out.println("调用了destroy方法。。。"); } }