本帖最后由 李时珍的皮~ 于 2018-5-21 15:18 编辑
第10天 JDBC
JDBC开发流程 step1:注册驱动:Class.forName()
step2:获得连接:Connection conn = DriverManger.getConnection(url,username,password)// Connection java.sql包下的
step3:编写SQL语句,String sql ="",以前的值的地方用占位符代替 ?就是占位符
step4:预编译sql并且获得可执行sql语句的对象PreparedStatement ps = conn.prepareStatemet(String sql)
step5:为sql语句设置值,用值代替sql语句中的? ps.setXXX(int n,值) n:代表第几个问号的意思,n从1开始
step6:执行sql语句
如果是查询:ResutSet rs = ps.executeQuery();
遍历结果集:
while(rs.next()){
rs.getXXX(String columnName)/rs.getObject(String columnName) ;
//columnName默认是表地段名,如果取了别名,用别名
}
如果是增删改:int num = ps.executeUpdate() ;// num 代表影响的行数
step7:释放资源工具类的抽取:Properties对象的使用
Properties prop = new Properties();
prop.load(new FileInputStream(String path));
prop.getProperty(String key)
属性文件:.properties
key=value
aaa=adfadf
bbb=dafda背后的思想:程序的解耦和 JDBC的事务管理事务的管理的对象:Connection conn 事务管理的核心的思想:逻辑上的一组操作使用的是同一个Connection对象 事务管理的核心步骤:开启事务:conn.setAutoCommit(false) 业务逻辑的操作 所有的业务逻辑操作都成功后提交事务:conn.commit() 一旦有异常回滚事务:conn.rollback() 第11天 连接池 druid/c3p0 1.导包 2.配置文件:在classpath下默认有个一个文件叫 c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web_test4</property>
<property name="user">root</property>
<property name="password">tsmysql</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>3.java
ComboPooledDataSource dataSource = new ComboPooledDataSource();第12天 DBUtils(web阶段使用) 增删改 QueryRunner qr = new QueryRunner(DataSource dataSource)
qr.update(String sql,Object ... obj)
第13天 tomcat 协议 Servlet tomcat部署 1.如果要用虚拟路径: tomcat\conf\Catalina\localhost:新建一个xxx.xml ,写 <Context docBase=""/> 访问路径:xxx 2.将项目导出成war包,直接扔到webapps下 协议请求行 头 体 1.get/post的区别: get提交的参数显示到地址栏,在请求行中地址后面;post提交的参数在请求体中 get有大小的限制,post没有 get没有请求体,post有 2.常见的请求头: User-agent:浏览器的类型 Referer:防盗链 响应行 头 体 1.常见的状态码: 302:重定向(结合Location响应头使用) 304:查找本地缓存 404:路径错误,资源真的不存在 500:代码写错了 2.常见的响应头: Location:结合302做重定向 Content-Disposition:文件下载的时候用 Refresh:定时刷新 Servlet访问规则:如果要访问一个servlet,这个地址串跟web.xml中配置的url-pattern有关系 接收参数String request.getParameter(String name); String [] request.getParameterValues(String name); Map<String,String[]> request.getParameterMap();
第14天 Servlet
Servlet生命周期(面试点一)用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中的init方法就会执行。任何一次请求,服务器都会创建一个 新的线程访问Servlet中的service的方法。在service方法内部根据请求的方式的不同调用doXXX的方法。()当Servlet从服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行。在整个生命周期中Servlet只有一个。 程序优化的思想:一次性的资源的加载(耗时的操作)放到服务器启动的时候 url-pattern的配置方式优先级关系:根本的原因,一次请求只有一次响应 完全路径匹配 > 目录匹配 > 扩展名匹配 ServetContext范围:整个web应用的范围 域对象存取数据setAttribute(String name,Object value); Object getAttribute(String name); removeAttribute(String name) ServetContext如何获得:在有servlet的环境下:this.getServletContext(); 范围:整个web应用的范围 域对象存取数据setAttribute(String name,Object value); Object getAttribute(String name); removeAttribute(String name) 读取web项目下的文件1.有servlet的环境下: InpuptStream getResourceAsStream(String path); String getRealPath(String path); 2.如果没有servlet的环境: 用类加载器去读取文件: InpuptStream is = 当前类的类名.class.getClassLoader().getResourceAsStream(String name); 企业级工具类的一个编写思想第
15天 Response 文件下载:把一个文件从服务器读取,写到客户端文件下载的核心思想:io 读/写的操作 InpuptStream is = new FileInputStream("服务器上的路径"); OutputStream os = response.getOutputStream(); 模板代码:
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!= -1){
os.write(b, 0, len);
}
is.close();Content-Type: getServletContext().getMimiType(String filename);Content-Disposition:"attachment;filename="+filename; 响应乱码response.getOutputStream():文件下载 下列方式:以后不常用 response.getWriter().print("");这种乱码问题如何解决:response.setContentType("text/html;charset=UTF-8"); Request获取客户端信息1.请求方式:request.getMethod(); 2.请求ip:request.getRemoteAddr(); 3.获取工程名:request.getContextPath(); 获取表单参数String request.getParameter(String name); String [] request.getParameterValues(String name); Map<String,String[]> request.getParameterMap(); 请求乱码get: String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8") post: request.setCharacterEncoding("UTF-8") 作为域对象存取数据范围:一次请求和响应的范围 setAttribute(String name,Object value); Object getAttribute(String name); removeAttribute(String name) 转发和重定向(面试点二)转发: request.getRequestDispatcher("不带工程名的路径").forward(request,response) 重定向: response.sendRedirect("带工程名称的路径") 区别:1.地址栏:转发地址栏不变,重定向会变 2.请求响应的次数:转发一次请求一次响应,重定向是两次请求和响应 如果给request域中存放了数据:转发能够获得到数据,重定向不能获得到数据 3.路径的编写:转发不带工程名,重定向带工程名 4.跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页
第16天 Cookie 如何获得:Cookie[] cookies = request.getCookies(); 如何向客户端写cookie:response.addCookie(Coookie cookie) 如何创建cookie:Cookie cookie = new Cookie(String name,String value); 获得名字:cookie.getName() 获得值:cookie.getValue(); 设置路径:cookie.setPath(String path); 设置有效期:cookie.setMaxAge(int age) 单位是:秒 作用范围:默认是一次会话,关闭浏览器就销毁 关于cookie存储中文的问题:
往回写cookie:
String value = URLEncoder.encode("老谭", "UTF-8");//"老谭"--fadsf%%33
Cookie cookie = new Cookie("aa",value);
response.addCookie(cookie);
获得:
Cookie [] cookies = request.getCookies();
Cookie aa= CookieUtils.findCookie(cookies, "aa");
if(aa!=null){
String value = aa.getValue();//fadsf%%33--"老谭"
String a = URLDecoder.decode(value, "utf-8");
}
第17天 Session 如何获得:HttpSession session = request.getSession(); 作为域对象存取数据session.setAttribute(String name,Object value);Object vlaue = session.getAttribute(String name);removeAttribute(String name); 范围:一次会话(根本原因:存SesssionID的cookie默认是会话级别的) 配置sessionion过期时间:web.xml
<session-config>
<session-timeout>5</session-timeout> <!--单位是分钟-->
</session-config>JSP三大指令: page: 全局错误友好页面的配置
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page> include: <%@ include file="" %> 静态包含 taglib: 九大内置对象(面试点三):
request HttpServetRequest
response HttpServetResponse
session HttpSession
application ServletContext
page Object
out JspWriter
pageContext PageContext
config ServletConfig
exception Throwable技能 拔高点:pageContext: 1.获取其他8个内置对象:getXXX()方法 2.可以向四个域中存取数据:
pageContext.setAttribute("pname", "pvalue", PageContext.PAGE_SCOPE);
pageContext.setAttribute("rname", "rvalue", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("sname", "svalue", PageContext.SESSION_SCOPE);
pageContext.setAttribute("aname", "avalue", PageContext.APPLICATION_SCOPE);
<%= pageContext.getAttribute("pname", PageContext.PAGE_SCOPE) %>
<%= pageContext.getAttribute("rname", PageContext.REQUEST_SCOPE) %>
<%= pageContext.getAttribute("sname", PageContext.SESSION_SCOPE) %>
<%= pageContext.getAttribute("aname", PageContext.APPLICATION_SCOPE) %>
动作标签:静态包含和动态包含的区别(面试点四)静态包含:相当于源代码的拷贝,只会翻译成一个Java类,有一个执行结果 动态包含:各自分别去翻译,各自执行,最终包含的是执行的结果
第18天 EL&JSTLEL 获取数据以什么名字存到域中,就以什么名字取出来,存进去是什么类型的,取出来就是什么类型 数组,List:[] ----遍历map,java对象:. .属性 EL执行运算empty:判断是否为空 not empty:判断是否不为空 lt gt le ge eq EL操作常用的web对象${cookie.名字.value} ${pageContext.request.contextPath} JSTL的中判断
<c:if test="${}">
test:如果test返回true,标签内的内容就会被输出
</c:if>
if标签没有else,如果想表达else的情况,从条件着手JSTL中的遍历
<c:forEach var="" items="" varStatus="status">
status.index
status.count
</c:forEach>
<c:forEach var="" begin="" end="" step="" varStatus="status">
</c:forEach>
|