第一章:JavaEE概述 1.什么是javaEE? javaEE是一个开发分布式企业级应用的规范和标准
2.javaME:手机开发 javaSE:标准版(java核心类,集合,jdbc,IO,网络编程),适用于桌面系统的开发 javaEE:企业版(javaSE,Servlet,ejb) 开发分布式企业应用标准和规范 3.快捷键: ctrl+1 提示操作 ctrl+D 删除当前行 ctrl+shift+O 组织导包 ctrl+shift+M 单独导包 ctrl+M 最大化当期窗体 Alt+Shift+R 重命名 ctrl+shift+F 格式化当前文本 ctrl+shift+F4 关闭当前打开的所有文件 4.获得站点的根路径:request.getContextPath(); 在指定图片的路径和response.sendRedirect()时经常
5.JavaEE体系结构分为表示层、中间层、数据层 三层功能: 表示层:由用户界面和用于生成界面的代码组成 中间层:包含系统的业务和功能代码 数据层:负责完成存取数据库的数据和对数据进行封装 三层技术: 表示层:HTML、JavaScript、Ajax 中间层:JSP、Servlet、JSTL、JavaBean、框架技术(Struts:Struts主要是扩展了Servlet) 数据层:JDBC、数据库框架技术(Hibernate:提供了以对象的形式操作关系型数据库数据的功能)
6.表单的两种提交方式区别: GET提交数据在地址栏内显示,不安全;而POST不显示,相对安全 GET提交数据量有限制(255个字符);而POST没有 GET请求的页面可以设置为书签或使用邮件发送;而POST不可以
7.HTTP协议是无状态协议,当浏览器向服务器发送一个请求后,服务器对该请求做出响应,当响应结束后,就断开连接,彼此并不保持连接信 息。当下次请求时,服务器能够区分是哪一个用户是通过存储在客户端Cookie中的sessionID
8.三层好处: 一个组件的更改不会影响其他两个组件。 由于表示层和数据层相互独立,因而可以方便地扩充表示层,是系统具有更好的扩展性。 代码重复减少。 方便分工和协作。不同的小组能够独立地开发应用程序的不同部分,并充分发挥各自的长处和优势 缺点:效率相对不高
第二章:Servlet基础 1.什么是Servlet Servlet是在服务器端运行以处理客户端请求并作出响应的程序(页面和模型层的中介)
2.Servlet中实现向浏览器中输出指定内容 PrintWriter out=response.getWriter(); out.println("<html>");
3.为了客户端无论使用什么方法提交请求程序都能正确地接收到数据,把处理代码都写在doGet()方法中,之后在doPost()方法中调用doGet()方法
4.Servlet生命周期 加载和实例化:当客户端发送一个请求时,Servlet容器(Tomcat)会查找内存中是否存在Servlet实例,如果不存在,就创建一个Servlet实例。如果存在Servlet实例,就直接从内存中取出该实例来响应请求。 初始化:初始化Servlet时,可以设置数据库连接参数,建立JDBC连接,或是建立对其他资源的引用。初始化阶段,init()方法被调用。 服务:Servlet初始化后,就处于响应请求的就绪状态。 销毁:销毁由容器完成,销毁调用Servlet的destroy()方法。
5.重定向:response.sendRedirect("/show.jsp"); 在浏览器中地址为:http://localhost:8080/show.jsp 请求转发:request.getRequestDispatcher("/login.jsp").forward(request,response);在浏览器中地址为:http://localhost:8080/f0806/login.jsp
6.中文乱码问题 get 提交 String name = request.getParameter("name"); new String(name.getBytes("ISO-8859-1"),"UTF-8"); post 提交 request.setCharacterEncoding("UTF-8")
页面编码: 1.pageEncoding="UTF-8" 源文件编码 2.contentType="text/html;charset=utf-8" 响应编码 contentType="image/jpeg" 3.浏览器编码 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
第三章:基于Servlet的会话跟踪(一) 1.在Web项目中使用session,是为了跟踪用户状态,并区分不同的用户
2.会话是Web容器创建的,而不是程序员创建的。当客户端浏览器第一次访问服务器的时候,服务器为客户端创建一个session
3.session结束有3种方式 ●浏览器关闭。 ●两次访问的间隔时间大于非活动时间(超时)。 ●调用HttpSession的invalidate()方法。 在session结束时,服务器会清空当前浏览器相关的数据信息
4.HttpSession用setAttribute()保存数据,用getAttribute()获取数据
5.设置session超时 ●代码中 session.setMaxInactiveInterval(60*60*2) 超时两小时 ●web.xml <session-config> <session-timeout>30分钟</session-timeout> </session-config> 6.创建会话(在购物车时经常用到) HttpSession session=request.getSession(boolean value); HttpSession session=request.getSession(); 第一种方法,布尔值为true时,如果存在与当前会话关联的会话,就返回该会话,否则创建一个新的会话,并把该会话返回。 布尔值为false时,如果存在与当前请求关联的会话,就返回该会话,否则返回null,不创建新的会话 第二种方法等同于第一种方法中布尔值为true的情况
7.获取application对象 ServletContext application=this.getServletContext();
第四章:基于Servlet的会话跟踪(二) 1.购物车可以使用(List、Map、Set) ,但最好使用Map,因为查找数据方便 Map 的方法:put(key,value)、 object get(key)、Collection values()
2.Java中常用的集合接口有List、Set和Map ●常用的List接口的实现类有ArrayList类、LinkedList类 ●常用的Set接口的实现类有HashSet ●常用的Map接口的实现类有HashMap类、Properties类
3.设置价格格式 <%@ page import="java.text.*"%> price=book.getPrice(); <%=new DecimalFormat("0.00").format(price)%>
4.在Servlet中获取当前提交页面的名称(使用过滤器时用到) String path=request.getServletPath(); if(path.equals("/login.jsp") ){ chain.doFilter(req,res); }
第五章:基于Servlet的MVC设计模式 1.什么时设计模式? 设计模式是一套反复使用、成功的代码设计经验的总结。
2.MVC的三个模块 模型(Model):对应的组件是JavaBean(Java类)。 视图(View):对应的组件是JSP或HTML文件。 控制器(Controller):对应的组件是Servlet。
第六章:高级JDBC 1.数据库连接的三种方式: ● 编码方式,把数据库配置信息直接写入Java代码中。 ● .properties文件,把数据库配置信息写在属性文件中,用程序读取。 ● 数据源,使用JNDI来获取DataSource对象,从而得到Connection对象。
2.为什么要使用数据库连接池? 数据库连接是非常占用系统资源的,为了提高应用程序的性能,优化数据库的连接,出现了数据库连接池。
3.什么是JNDI? JNDI是将对象和名字绑定的技术,容器生产出对象,这些对象都和唯一的名字绑定。外部程序都可以通过名字来获得该对象。
4.JNDI配置 ● 如果想用全局配置,在tomcat的context.xml中配置 ● 如果只想在某个项目中用,在META-INF下新建一个context.xml
第一步:在context.xml中 <Context reloadable="true"> <WatchedResource>WEB-INF/web.xml</WatchedResource> <Resource name="jdbc/books" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="123" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DataBaseName=books" /> </Context>
reloadable="true" 表示该xml内容改动后,重新加载该xml <WatchedResource>WEB-INF/web.xml</WatchedResource>监听web.xml是否改动,如果改动,重新加载web.xml
第二步:在web.xml中 <web-app> <resourc-ref> <description>E-Books DataSource</description> <res-ref-name>jdbc/books</res-ref-name> <res-type>javax.sql.DataSource</res-type> --->一定要在<res-auth>之前 <res-auth>Container</res-auth> </resource-ref> </web-app>
第三步:将数据库驱动拷贝到tomcat的common\lib下面
第四步: 代码中获取数据库连接 import java.sql.*; import java.naming.Context; import java.naming.InitialContext; import javax.naming.NamingException; import java.sql.DataSource;
public class DBManager{ public Connection getConn(){ Connection conn=null; try{ Context ic = InitialContext(); DataSource source=(DataSource) ic.lookup("java:comp/env/jdbc/books"); conn=source.getConnection(); }catch(NamingException e){ e.printStackTrace(); } return conn; } }
5.属性文件的数据库配置(.properties文件形式只能保存String类型信息) 第一步: 在项目默认路径(src)下创建文件,名称为db.properties(名称可自定以,后缀名不行) 在db.properties中写入如下内容 driver=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://localhost:1433;DatabaseName=books user=sa password=sa 第二步: import java.io.InputStream; import java.util.Properties;
public class Env extends Properties { private static Env instance; //只创建一个实例 public static Env getInstance() { if (instance != null) return instance; else { makeInstance(); return instance; } } //同步方法,保证在同一时间,只能被一个人调用 private static synchronized void makeInstance() { if (instance == null) { instance = new Env(); } }
private Env() { InputStream is = getClass().getResourceAsStream("/db.properties");//加载db.properties文件 try { load(is);//取得属性列表 } catch (Exception e) { System.err.println("错误:没有读取属性文件,请确认db.property文件是否存在"); } } }
第三步: public static synchronized Connection getConn(){ String driverClassName = Env.getInstance().getProperty("driver"); String url = Env.getInstance().getProperty("url"); String user = Env.getInstance().getProperty("user"); String password = Env.getInstance().getProperty("password"); try { Class.forName(driverClassName); conn = DriverManager.getConnection(url, user, password); } catch (Exception ex) { ex.printStackTrace(); } return conn; }
6.自定义异常:在编写程序时,由于错误信息位置不够具体和准确,从而不能很快找到错误,所以需要自定义异常 public class MyException extends Exception { protected Exception throwable; public MyException(){ super(); } public MyException(String message){ super(message); } public MyException(String message,Exception throwable){ super(message); this.throwable=throwable; } public Exception getCause(){ return throwable; } }
使用自定义异常 public static synchronized Connection getConn() throws MyException{ String driverClassName = Env.getInstance().getProperty("driver"); String url = Env.getInstance().getProperty("url"); String user = Env.getInstance().getProperty("user"); String password = Env.getInstance().getProperty("password"); try { Class.forName(driverClassName); conn = DriverManager.getConnection(url, user, password); } catch (Exception ex) { throw new MyException("获取数据库连接失败"); } return conn; }
第七章:标准动作 1.JavaBean 要满足一下要求三个要求 →是一个公有类,并提供无参的公有的构造方法 →属性私有 →具有公有的访问属性的getter和setter方法
2.JSP标准动作 ● jsp:useBean 动作用来装载一个将在jsp页面上使用的JavaBean,相当于创建了一个对象 <jsp:useBean id="name" class="package.class" scope="scope">
scope的值 page JavaBean只能在当前页面中使用。当加载新页面时就会将其销毁。 request JavaBean在用户对其发出请求时存在。 session JavaBean一直存在会话中,直至其终止或被删除为止。 application JavaBean在整个应用程序中均可使用。
例:<jsp:useBean id="order" class="y2javaee.sg.ch07.order" scope="request"> ● jsp:setProperty 动作用于设置useBean中指定的JavaBean的属性值。 <jsp:setProperty name="BeanName" property="PropertyName" value="Value" param="Parameter"> name 为useBean中使用的JavaBean的id,property 为要设置值的JavaBean的属性名称 如果property和param的名字一样,则可用<jsp:setProperty name="BeanName" propertyName="*"> 代替
例:<jsp:setProperty name="order" property="username" value="accp"> ● jsp:getProperty 动作获取JavaBean中指定的属性值 <jsp:getProperty name="beanName" property="propertyName"> name 为useBean中使用的JavaBean的id,property为要获取值的JavaBean的属性名称
例:<jsp:getProperty name="order" property="username">
● <jsp:include page="head.jsp" /> 动态包含 将运行后的结果包含的指定的页面。 <%@ include file="head.jsp" %> 静态包含 将页面的源代码包含到指定的页面。
● <jsp:forward page="/url"><jsp:param name="参数名" value="参数值"/></jsp:forward> <jsp:forward>实质是使用RequestDispatcher对象的forward方法实现转发的 在浏览器中地址为:http://localhost:8080/webapps/...
第八章:EL和JSTL 1.EL表达式是为了解决JavaBean中的属性是对象时的读取
2.在EL表达式中获取应用程序的根路径 ${pageContext.request.contextPath()} 获取session的Id ${pageContext.session.id}
3.EL隐式对象 ${param.name} 相当于request.getParameter("name"); ${paramValues.name} 相当于request.getParameterValues("name"); ${param.name} 如果没有值,输出“”,不会是null
pageContextScope、requestScope、sessionScope、applicationScope 4.${empty param.loginName} 判断表单提交的loginName是否为空或“” 如果为空,则为true 例: <c:if test="${!empty requestScope.detailsInfo}"> <c:set var="foodDetail" value="${requestScope.detailsInfo}" /> </c:if>
5.如果在标准动作中定义的变量,可以在EL表达式中可以直接访问到。 在小脚本中或者servlet中定义的变量则必须通过域才能访问${requestScope.num} 如果${num},则程序从前往后找不同域中是否有num,找到后,则不往下找,一般取数据时要指定域
6.JSTL:解决 java 脚本的逻辑判断 通用标签:set、remove、out 核心标签库: 条件标签:if 迭代标签:forEach
SQL标签库:update、param、query 使用JSTL标签 <%@ taglib uri="http://java./jsp/jstl/core" prefix="c" %> <c:set var="example" value="${100+1}" scope="session"> <c:out value="${example}"> <c:remove var="example" scope="session">
<c:out value="value" default="100"> 当值不存在时,输出100 <c:out value="${<a href='ww.baidu.com'>test</a>}" escapeXml="false"> 输出为一个链接
<c:if test="${!empty requestScope.detailsInfo}"></c:if> 多分支: <c:choose> <c:when test="条件运算"> .... </c:when> <c:when test="条件运算"> .... </c:when> <c:otherwise> .... </c:otherwise> </c:choose> <c:forEach item="${sessionScope.bookTitles}" var="currentBook" varStatus="status"></forEach> varStatus="status"相当于for中的i变量 <c:forEach var="j" begin="1" end="10" step="2"></forEach> 输出1、3、5、7、9
7.SQL标签使用 增、删、该 <%@ taglib uri="http://java./jsp/jstl/sql" prefix="sql" %> <%@ taglib uri="http://java./jsp/jstl/core" prefix="c" %> <sql:setDataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=restrant" user="sa" password="sa" var="conn"/> <sql:update var="order" dataSource="${conn}"> insert into foodOrderInfo values(?,?,?,?,?,?,?) <sql:param value='${param["name"]}'/> <sql:param value='${param["addr"]}'/> <sql:param value='${param["zip"]}'/> <sql:param value='${param["tel"]}'/> <sql:param value='${param["mov"]}'/> <sql:param value='${param["bz"]}'/> <sql:param value='${sessionScope.total}'/> </sql:update> <c:if test="${order==1}"> <% session.removeAttribute("food"); %> <c:redirect url="/seeYou.jsp"/> </c:if> 查 <sql:setDataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=restrant" user="sa" password="sa" var="conn"/>
<sql:query var="rs" dataSource="${conn}"> select * from foodOrderInfo </sql:query> <c:forEach var="row" items="${rs.rows}"> <tr> <td>${row.customerName }</td> <td>${row.address }</td> <td>${row.zipCode }</td> <td>${row.telephone }</td> <td>${row.movePhone }</td> <td>${row.notice }</td> <td>${row.totalPrice }</td> </tr> </c:forEach>
8.格式化标签: <%@taglib uri="http://java./jsp/jstl/fmt" prefix="fmt"%> 格式时间: <fmt:formatDate value="${now}" pattern="yyyy-MM-dd hh:mm:ss"/> 格式数值: <fmt:formatNumber value="100000" type="currency" ></fmt:formatNumber>
9. 函数标签: <%@taglib uri="http://java./jsp/jstl/functions" prefix="fn"%> ${fn:toUpperCase('abc')}
第九章:Web服务 1.使用XFire创建和发布Web服务的步骤如下。 ● 添加XFire库 ● 添加XFire-all-1.2.6.jar包 ● 创建服务接口和实现类 ● 配置servies.xml文件 ● 配置web.xml文件 ● 添加xalan.jar包,测试web服务是否正常工作 ● 创建客户端程序访问Web服务
2.web.xml <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
3.在META-INF文件夹下新建services.xml <service> <name>CreditCard</name> <namespace>www.sss.com.cn</namespace> <serviceClass> y2javaee.sg.ch09.IProcessCredit </serviceClass> <implementationClass> y2javaee.sg.ch09.ProcessCreditCard </implementationClass> </service>
4.public int ramGain() { Service serviceModel = new ObjectServiceFactory().create(Iweather.class); XFire xfire = XFireFactory.newInstance().getXFire(); XFireProxyFactory factory = new XFireProxyFactory(xfire); String url = "http://localhost:8080/restrant/services/weatherService"; Iweather client = null; try { client = (Iweather) factory.create(serviceModel, url); } catch (Exception e) { System.out.println("客户端调用异常" + e.toString()); } int num = 0; try { num = client.getRanNum(); } catch (Exception e) { System.out.println("获取随机数错误" + e.toString()); } return num; }
5.单元测试JUnit4 :优点是不再需要将所有的方法命名为 testFoo()、testBar(),等等 import org.junit.Test; import junit.framework.TestCase; public class AdditionTest extends TestCase { private int x = 1; private int y = 1; @Test public void testAddition() { int z = x + y; assertEquals(2, z); } }
只要用 @Test 来注释测试方法,就可以将测试方法放到任何类中。但是您需要导入 junit.Assert 类以访问各种 assert 方法,如下所示: import org.junit.Assert; public class AdditionTest { private int x = 1; private int y = 1; @Test public void addition() { int z = x + y; Assert.assertEquals(2, z); } }
您也可以使用 JDK 5 中新特性(static import),使得与以前版本一样简单:
import static org.junit.Assert.assertEquals; public class AdditionTest { private int x = 1; private int y = 1; @Test public void addition() { int z = x + y; assertEquals(2, z); } }
在 JUnit 4 中,您仍然可以在每个测试方法运行之前初始化字段和配置环境。然而,完成这些操作的方法不再需要叫做 setUp(),只要用 @Before 注释来指示即可,如下所示:
@Before protected void initialize() { System.setErr(new PrintStream(new ByteArrayOutputStream())); inputDir = new File("data"); inputDir = new File(inputDir, "xslt"); inputDir = new File(inputDir, "input"); }
在 JUnit 4 用 @After 代替 JUnit3 中的tearDown() @After protected void disposeDocument() { doc = null; System.gc(); }
测试异常
异常测试是 JUnit 4 中的最大改进。旧式的异常测试是在抛出异常的代码中放入 try 块,然后在 try 块的末尾加入一个 fail() 语句。例如,该方法测试被零除抛出一个 ArithmeticException:
public void testDivisionByZero() { try { int n = 2 / 0; fail("Divided by zero!"); } catch (ArithmeticException success) { assertNotNull(success.getMessage()); } }
该方法不仅难看,而且试图挑战代码覆盖工具,因为不管测试是通过还是失败,总有一些代码不被执行。在 JUnit 4 中,您现在可以编写抛出异常的代码,并使用注释来声明该异常是预期的:
@Test(expected=ArithmeticException.class) public void divideByZero() { int n = 2 / 0; }
补充: 1.过滤器:设置网页编码的过滤器 ● Servlet 中 public class EncodingFilter extends HttpServlet implements Filter { private String charset=null; public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(charset); res.setCharacterEncoding("GBK"); chain.doFilter(req, res); }
public void init(FilterConfig config) throws ServletException { charset=config.getInitParameter("charset"); if(charset==null) charset="GBK"; } }
● web.xml文件中 <filter> <filter-name>Encoding</filter-name> <filter-class>web.EncodingFilter</filter-class> <init-param> <param-name>charact</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.监听器:获取数据库连接和关闭数据库连接 ●Servlet 中 public class ContextListener extends HttpServlet implements ServletContextListener { public void contextDestroyed(ServletContextEvent sce) { DBManager.closeConnection(); }
public void contextInitialized(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); String driver = context.getInitParameter("driver"); String url = context.getInitParameter("url"); String user = context.getInitParameter("user"); String password = context.getInitParameter("password"); DBManager.getConn(driver, url, user, password); } }
●web.xml中 <context-param> <param-name>driver</param-name> <param-value>com.microsoft.sqlserver.jdbc.SQLServerDriver</param-value> </context-param> <context-param> <param-name>url</param-name> <param-value>jdbc:sqlserver://localhost:1433;DatabaseName=restrant</param-value> </context-param> <context-param> <param-name>user</param-name> <param-value>sa</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>sa</param-value> </context-param> <listener> <listener-class>web.ContextListener</listener-class> </listener>
3. 判断用户是否登录的Servlet public class IsLogin extends HttpServlet implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String path = request.getServletPath(); String pathFormate = path.substring(path.lastIndexOf(".") + 1,path.length()).toLowerCase(); //如果是以下条件,不需要判断是否已经登录 if (path.equals("/ch07/checkLogin.jsp") || path.equals("/ch07/checkOut.jsp") || path.equals("/ch07/login.jsp") || path.equals("/ch07/middle.jsp") || path.equals("/ch07/show.jsp") || pathFormate.equals("css") || path.equals("/login.jsp") || path.equals("/LoginServlet") || pathFormate.equals("gif") || pathFormate.equals("jpg") || pathFormate.equals("js")) { chain.doFilter(req, res); } else { HttpSession session = request.getSession(false); if (session != null) { if (session.getAttribute("login") == null) { response.sendRedirect(request.getContextPath()+ ("/login.jsp")); return; } else { chain.doFilter(req, res); } } else { response.sendRedirect(request.getContextPath() + ("/login.jsp")); return; } } } web.xml中 <filter> <filter-name>IsLogin</filter-name> <filter-class>web.IsLogin</filter-class> </filter> <filter-mapping> <filter-name>IsLogin</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
4.Servlet 中下载 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); HttpSession session = request.getSession(); Cart cart = null; if (session.getAttribute("food") != null) { cart = (Cart) session.getAttribute("food"); CreateExcel.createXls(cart.getAllCart()); // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 su.initialize(null); // 设定contentDisposition为null以禁止浏览器自动打开文件 su.setContentDisposition(null); try { su.downloadFile("c:\\1.xls"); } catch (SmartUploadException e) { e.printStackTrace(); } } }
|