学习MVC架构开发
servlet + jdbc
1. servlet
1-1 导包:即:servlet-api.jar和jsp-api.jar包。 (有的eclipse是需要导这两个包的,这两个包在Tomcat的lib目录下可以找到)
1-2 版本:2.5版本/3.几系列的版本(3.几系列的版本不像2.5版本那样只可以使用web.xml来开发,它还 可以使用注解@webServlet(/...))
1-3 配置:
1-3-1 XML配置
继承:HttpServlet类(还可继承这两个类:Servlet类和GenericServlet类。只不过很少用)
重写:该类的service()方法
配置:web.xml文件
<servlet>
<servlet-name>配对名</servlet-name>
<servlet-class>servlet类的全名(是点结构:包名+类名)</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>配对名</servlet-name>
<url-pattern>访问入口(必须/开头)</url-pattern>
</servlet-mapping>
1-3-2 注解配置
继承:HttpServlet
重写:service方法
注解:@webServlet("/访问入口")
Tips:3.0版本的Servlet 也可以使用xml文件来配置。(就是说,3.0版本不仅可以使用1-3-2这种方式,也可以使用1-3-1这种方式)
1-4 转码:
对请求(从浏览器端到服务器端)进行转码: request.setCharacterEncoding("UTF-8");
对响应(从服务器端到浏览器端)进行转码 :
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8"); (建议用它)
关键是:写JDBC的四大参数中的url的时候,需要在最后加一个 ?characterEncoding=utf8这样才能最好的避免中文乱码出现。
1-5 接值(在Servlet类中接收从前端传来的值)
前提:所使用的getP../getP..s的方法的参数name要和页面上表单组件元素的name一致。(注意:这里是说表单中的组件标签,若是前端页面中非表单中的标签则不是通过name属性来获取参数的)
接单个值:String name = request.getP("name");
接多个值:String[] names = request.getParameterValues("name");
1-6 调用(在Servlet类中接收到值后可以开始调用service层的方法)
调用service层的方法:业务处理全部都在service中搞定。
1-7 存储(把调用service方法得到的返回值存储起来,以便前端页面使用)
一次请求:(在request域)
request.setAttribute(k,v); : 一次跳转页面之内
一次会话:(在session域)
request.getSession().set... : 一次浏览器会话(默认是保存30分钟)
一次服务:(在application域)
session.getServletContext().set... : 一次服务器启动周期
tips:你想在页面上展示的数据需要存起来
tips:你想在其他地方取出值,也需要提前存好
1-8 转(存储好之后,可以开始跳转页面了)
请求转发:
代码:request.getRequestDispatcher("路径").forward(request,response);
路径:不带工程路径,浏览器地址栏也不变
重定向:
代码:response.sendRedirect("路径");
路径:前面拼接工程路径,浏览器的地址栏会改变
注意:一般来说,用请求转发还是用重定向都差不多。但是在进行增删改查中的添加操作时,必须要用重定向来跳转,而不能用请求转发。(具体原因等你写项目的时候就会发现了)
1-9 过滤器(可以用来防止用户非法登录。一旦用户直接从浏览器中输入网站的主页的地址,而不是通过登录页面登录进去的,过滤器就会将其“打回原形”)
关键字:filter
1-9-1 自己创建一个过滤器类并且 implements Filter接口
重写该接口的init / destroy / doFilter这三个方法
1-9-2 要在web.xml文件中进行配置,内容如下:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.oracle.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--在下面写, 哪些路径会被你拦截 ,只要是跟下面这个路径沾边的,都会被拦住。拦住之后,会进到你创建的MyFilter类中的doFilter方法中,你可以在doFilter方法中进行判别,看给哪些东西放行 -->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
1-9-3 其中doFilter方法中有三个参数
request / response / chain
tips: chain对象中有一个doChain(request,response)方法可以用来放行
Tips:也可以将转码的那两条操作代码放在过滤器类的doFilter方法中
1-10 监听器
listener
监听器Listener案例:
防止多人同时在线一个账号,因为涉及到了多个浏览器,这时只使用session就不合适了。所以就要使用application了。(注意:application中只是存放List集合的。而List集合存放所有的用户)
使用过程:
1、自定义一个MyListener类。让其实现ServletContextListener接口。
并重写里面的两个方法。
①contextDestroyed方法:在里面写 服务器(如Tomcat)关闭时 所要做的操作
②contextInitialized方法:在里面写 服务器启动时 所要做的操作
2、然后在web.xml文件中进行配置,如下:
<!-- 监听listener的配置方式 -->
<listener>
<listener-class>com.oracle.listener.MyListener</listener-class>
</listener>
1-11 报表打印
1-11-1 导包(有几个jar包)
1-11-2 导入模版 自己在项目中自己找位置导入模版,如template/template.xls。(创建了template文件夹并放入一个空xls文件。里面放你要怎么展示数据的那个模板)
1-11-3 在服务器 如tomcat/webapps/项目名 中创建一个down文件夹(也可以用Java代码IO流中的File类创建)
1-11-4 创建一个servlet专门负责数据和xls数据的转换和下载业务
1. servlet准备数据,数据需要是Map格式
2. 获取模版路径 template_path
3. 获取上传文件路径 folderPath(需要自己拼接一下文件名,必须是.xls后缀的)
4. 获取转换器对象XLSTransformer
5. 调用XLSTransformer中的transformXLS()方法来转换数据
p1:模版路径
p2:数据源
p3:上传路径
OK搞定了!
tips:如果你想要下载下来,使用如下语句:(它起到下载的作用)
resp.sendRedirect(req.getContextPath()+"/down/abc.xls");
-
ajax(要使用它的话,记得要导入JQuery的那个库文件)
ajax可以达到异步刷新页面的效果。(这样的话就可以节省网络资源)
$.ajax({ type:"post", // post/get/put/delete url :"路径", // 你要跳转的路径(去某个地方拿值) data:{k:v,k:v,...}, // 以json对的格式传递数据 //async:false;//这句的作用是 将Ajax的异步变为了同步,很少用到 success:function(a,b){//这里的参数可以只写一个,也就是参数a,本来是有三个的,但是后面两个作用不大 // a是从后台Servlet中返回的值,它是一个字符串 // b是返回的状态.本来还有一个c,c是属性的集合,c中包括了a、b,但是为了突出a、b,就将a、b单独拿出来了(使用更方便)。 } });
-
jdbc
3-1 DataSourceFactory / DataSource.java
数据库驱动 提供了一个同步的获取链接的方法getConnection(); 提供了两个关闭资源的重载方法(); 3-1-1 连接池List<Connection> 3-1-2 属性文件获取:DataSource.properties 注意:在使用我提供的jar包的时候(我已经上传到CSDN中了,需要的可以去下载),要创建一个res资源文件夹,然后在里面创建一个配置文件,将jar包中的配置文件的内容粘贴进去。这样在Java中就近原则下,项目会先使用咱创建的res中的文件。(原因:我提供的jar包中封装的DataSource.properties配置文件已经变成了一个只读文件,所以需要你自己再创建一个同名文件)
3-2 JDBCFactory / JDBC
全查:retrieveAll 单查:retrieveOne 增删改:doDML 批量操作:doBatch 。针对同一类型的sql语句 批量删除:doDelete。 同上,但是条件只能有一个,这里是按id批量删除
3-3 IdFactroy
通过UUID来创建一个随机不重复的32位码作为ID。 也可通过序列来获取序列中的下一个值作为ID。
-
JSP
<% %> 这个符号里面可以使用原生java代码段
<%= %> 这个符号里面可以直接引用一个java变量。(个人觉得这个符号的作用更像java类中的输出语句)
<%@ %> 这个符号里可以用来导包4.1 EL表达式(只用于jsp页面中,html页面不可使用)
格式:${xxx} 取值:${requestScope.xxx} //requestScope这个域对象是可省略不写的,其余则不可省略 取值:${sessionScope.xxx} 取值:${applicationScope.xxx} tips:EL表达式是在jsp页面加载之前就已经获取了值的,然后页面加载的时候会将获取的值拼接到页面上。 EL表达式有个大特点:就是,当你没有获取到东西的时候,在浏览器页面不会显示null,而是啥都不显示。(而如果你在jsp前端页面使用request.getParameter("hhhhh");方法来获取的话,即使没有获取到东西,也会在页面显示null这个符号)
4.2 JSTL标签(最常用的是C标签也就是核心标签库,实际上还有fmt这个格式化标签库)
4.2.1 需要先导入JSTL中相应的标签库。进行导入操作的代码如下: <%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %> tips:一定要放在jsp前端页面中尽可能靠前的位置 tips:如果jsp页面报错,并显示不支持JSTL标签库,说明可能是缺少相应的jar包,往项目导入standard.jar包和jstl.jar包。(这些jar包一般来说MyEclipse中都是内置有的,而eclipse则不一定了。) 4.2.2 判断 <c:if test="判断条件"></c:if> <c:choose> <c:when test="${fenye.pages<=10}"> <c:set var="begin" value="1"/> <c:set var="end" value="${fenye.pages}"/> </c:when> <c:otherwise > <c:set var="begin" value="${fenye.pageNo-5}"/> <c:set var="end" value="${fenye.pageNo+4}"/> </c:otherwise> </c:choose> 注意:<c:choose>c标签就相当于java代码中的if/else if/else结构 4.2.3 循环 <c:forEach></c:forEach> 该标签中的属性常用的有如下这些 var="e" - 循环中间变量 items="xx" - 要循环哪个集合(List)或数组 varStatus="i" - 可以自动生成编号或角标 i.count i.index
监听器Listener案例:防止多人同时在线一个账号,因为涉及到了多个浏览器,这时使用session就不合适了。所以就要使用application了