最近花了一个月的时间系统的学了一遍Java Web的常用知识,今天做个小小的总结,以备下次复习。 具体分为以下几点去讲:
一:Web 记得上次我在公司出面试题的时候就问了这么个问题:请解释一下什么是web? 现在想起来,这题也太2了,估计做了好多年web开发的人也很难总结出它的具体概念。 在这我就简单阐述一下,个人理解Web就是一种超文本信息系统,也就是WWW(World Wide Web),所以web也可以理解为www服务即通过http协议或者别的协议在Internet上提供信息服务系统,这些信息具有一定的格式包括文本、图片、视频等等。
二:安装软件 “工欲善其事,必先利其器”,所以先安装好必要的工具,包括:JDK(Java Development
Kit即java开发工具包),MyEclipse,Tomcat。其实我们在安装Eclipse时与JDK没任何关系的,不要想着没有了JDK那
MyEclipse就用不了,这是不可能的,因为MyEclipse也是用java的GUI写的,所以它能运行,那就肯定自带jre(Java
Runtime
Environment即java运行环境),而我安装的是MyEclipse6.5从安装到现在从来没设置过任何环境变量配置(我指的是和我以前安装的
JDK没做任何联系配置),但仍然用的很好,所以说它肯定也自带了类似Javac这样的编译器,而且还自带了很多java内裤。不过安装JDK的好处是它
有很多有用的命令如:javac,java,jar,javadoc,nativeAscII等等,而且还有一点就是我做的是J2EE开发,所以必须要装
web服务器如tomcat,但是在tomcat中我们要把Jsp转换成servlet的.java文件再转换成.class字节码文件,所以在这里就需
要java编译器和java内裤了,而至于tomcat是怎么找到JDK的,这个估计是通过注册表吧,或者别的方式,因为我从来没配置过tomcat环境
变量,而且有次我取消了JDK配置的path环境变量,tomcat还能照常工作。 其实我们作为一名开发者,最好一直装上JDK并配好path环境变量,即使我们只用MyEclipse做J2SE的开发。
三:Servlet Servlet的继承层次很多,但是我们web开发常用的也就是
javax.servlet.http.HttpServlet这个类,我们常用的两个请求方法是doGet(),doPost(),还有从父类继承过来
的方法init()初始化,destroy()Servlet销毁时会被调用,getServletConfig()获得ServletConfig对
象,getServletInfo()返回有关Servlet的信息,包括作者、Servlet版本等。 Servlet的访问必须在web.xml,怎么配置会在下面举例。 常用方法: 1、request.setCharacterEncoding("utf-8");//设置用post传递给服务器的参数编码方式 2、response.setContentType("text/html;charset=utf-8");//设置发送给浏览器的内容编码 3、HttpSession session = request.getSession();//获得session会话 session.setAttribute("a","b");//给session作用域中存值 可以这样取值:session.getAttribute("a"); 4、ServletContext context = this.getServletContext();整个web应用对象,或者用ServletConfig对 象.getServletContext()获得 String str = context.getInitParameter("encoding");//获得全局参数 5、ServletConfig config = this.getServletConfig("p1");//获得某个Servlet专用的配置对象 String str =config.getInitParameter("p2");//获得某个Servlet的专有配置参数 6、String str = request.getParameter("s");//获得页面传过来的参数 7、String[] sa = request.getParameterValues("sa");//获得字符串数组 8、request.setAttribute("r","宝宝");//往request作用域中存值。在页面可以${r}这样取出宝宝。 9、PrintWriter out = response.getWriter();//获得标准输出流,此流内部做了处理直接会输出给浏览器。 10、request.getRequestDispatcher("/index.jsp").forward(request,response);//转发 response.sendRedirect("index.jsp");跳转
四:jsp 1、常用指令:<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8" %> <%@ taglib uri="http://java./jsp/jstl/core" prefix="c"%> <%@ include file="/index2.jsp"%> 2、常用动作: <jsp:forward page="/index1.jsp"> <jsp:param name="username" value="BAOBAO"/> </jsp:forward> 上面的forward相当于Servlet中的Request.getRequestDispatcher("/index1.jsp").forward(request,response);
<jsp:include page="/index.jsp"> <jsp:param name="username" value="宝宝"/> </jsp:include> 记
得在面试的时候经常会有人问到<%@ include
%>指令和<jsp:include>动作的区别,其实最主要一点就是include指令在jsp转换成Servlet前已经把
file设置的Jsp页面融入进当前jsp了,也就是说不论你用include指令包含了多少个Jsp,最后只会生成一个servlet文件,所以
include指令也不会传递参数。
3、9大内置对象: out、request、response、session、
application(ServletContext)、page(相当于Servlet中的this,代表当前页面即当前Servlet)、
pageContext(这个就是给当前jsp页面放置了一个变量
pageContext.setAttribute("CONTEXT_ROOT",request.getContextPath());)、
exception、config(ServletConfig) 4、关于页面跳转陷阱:jsp中的绝对路径(/index.jsp)和servlet不同,它的根是指服务器即:http://localhost:8088/这是jsp的根,而Servlet的根指的是你的项目。 5、接参 在
Jsp页面<%=request.getParameter("username")%>就等于${param.username},一般页
面给页面传的参数或者url中的参数在jsp中都可以用${param.name}去获取。${username}这样直接获取的是已经放在那4大作用域
里面的值。 6、jsp EL4大内置对象:pageScope,requestScope,sessionScope,applicationScope,比如:${requestScope.username},如果不加这些内置对象则按照从小到的作用域范围去查找。
五:JDBC 常用方法(以oracle为例): String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL9I"; String username = "test"; String password = "test"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url,username,password); conn.setAutoCommit(false); /*Statement s = conn.createStatement(); s.execute("insert into employee(id,name) values(1,'马文涛')");*/ PreparedStatement ps = conn.prepareStatement("insert into employee(id,name) values(?,?)"); ps.setInt(1,2); ps.executeUpdate(); conn.commit(); ps = conn.prepareStatement("select * from employee"); ResultSet rs = ps.executeQuery(); while(rs.next()){ System.out.println("id:"+rs.getInt("id")+" name:"+rs.getString("name")); } if(rs != null) rs.close(); if(ps != null) ps.close(); //自己可以加个连接池,tomcat自带着,Hibernate也带着,Spring也有,自己也可以写个简单的连接池。
六、Cookie(保存在客户端,由web服务器创建,session会话在服务器端,但也必须依赖在内存中的临时cookie,它要靠内
存中的临时cookie中的jsessionid来实现,当客户禁止了cookie那session就无法工作,除非重写url把jsessionid值
附加到此url中)
常用方法: Cookie cookie1 = new Cookie("username",username);实例化一个cookie cookie1.setMaxAge(60*60*24);//设置最大保存时间 response.addCookie(cookie1);//添加cookie Cookie[] cookies = request.getCookies();//获取客户端所有cookie cookie.getName()、cookie.getValue()//获得cookie名字和值
七、常用EL表达式和JSTL标签 ${}取值、empty空、!非、?:三目运算符、==和!= <c:if test=""></c:if>、<c:forEach items="${list}" var="user" varStatus="i">${i.index+1}</c:forEach>、 <c:choose> <c:when test="${currentPageNumber eq pageNumber}"> <font color="red">${pageNumber}</font> </c:when> <c:otherwise> <a href="${pageUrl}">${pageNumber}</a> </c:otherwise> </c:choose>
八、自定义标签库(函数库比较方便,不用集成Tag等类) 此tld文件也是个xml文件,就是后缀不同,把它放到WEB-INF下,和web.xml同级。 <function> <description> 判断前面字符串和后面的长度,前面长了返回true,否则返回false </description> <name>lengthTest</name> <function-class>com.mwt.functions.Length</function-class> <function-signature>boolean lengthTest(java.lang.String, java.lang.String)</function-signature> <example> <c:if test="${myfn:lengthTest(s1,s2)}"> </example> </function>
public class Length {//这个类是公共的,方法是静态的。 public static boolean lengthTest(String s1,String s2){ if(s1.length()>s2.length()) return true; else return false; } }
九、监听器 HttpSession有4个监听借口,ServletContext有2个监听借口,HttpServletRequest有两个监听借口。 监听器的作用就是当用户做出某些响应后则实现了对应监听器接口的类的某些方法会自动执行 web.xml中的配置: <listener> <listener-class> com.mwt.Listener.CountListener </listener-class> </listener>
十、过滤器 过滤器要实现Filter接口,它的作用就是特定的访问要进过过滤器的某些方法过滤后在去执行所请求的类。 如:过滤所有请求的编码 <filter> <filter-name>encoding</filter-name> <filter-class>com.mwt.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter>
十一、文件上传(包括图片,电影,文本等) 用fileupload组件上传
十二、发送邮件 apache提供了Commons EMail组件封装了javamail所以用起来很方便 SMTP是邮件发送协议,POP3邮件接收协议。(可以直接用新浪或者163做测试)
十三、分页 可以下载个pager-taglib.jar,这个标签库比较方便,在前台就和google的分页一样,也有其他样子。 oracle分页SQL: select * from (select rownum r,e.* from (select * from employee order by ?)e where rownum<=?) where r>=?
十四、FCKeditor编辑器 <form action="/FCKeditor/servlet/FCKeditor" method="post"> 主题:<input type="text" name="title" size="100"/><br> <script type="text/javascript"> var FCKeditorObject = new FCKeditor("fckeditor"); FCKeditorObject.BasePath = '/FCKeditor/fckeditor/'; FCKeditorObject.Height = 400; FCKeditorObject.ToolbarSet = 'Default'; FCKeditorObject.Create(); </script> <input type="submit" value="提交"/> </form>
十五、关于编码 1、 <%@ page language="java" contentType="text/html;charset=utf-8"%> <!-- 这个charset虽然是服务器返回给浏览器的编码,但它可能也改变浏览器本身的编码,即通知浏览器采用什么编码去显示内容。 -->
2、 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%// pageEncoding是JSP本身的编码,即它被转换成.java时所采用的编码,如果不设置默认为iso8859-1,这个和下面charset一般只设置一个,两个会同步。%> <!-- 当.java文件在编译器编译成.class的时候都会采用utf-8去编译成二进制的字节码文件--> <%//@
page language="java" contentType="text/html;charset=utf-8" 默认是iso8859-1
contentType里面的charset是指服务器吐出的内容的编码,也就是发送给客户浏览器时的编码 %>
3、 request.setCharacterEncoding("utf-8");//设置用post传递给服务器的参数编码方式(默认iso8859-1)。 如果是get方式传递参数则可以在tomcat里的配置文件中改编码即: <Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/> 如果还是解决不了乱码则可以从新组装字符串 如:byt[] b = str.getBytes("iso8859-1"); String newStr = new String("b","utf-8");
4、 response.setContentType("text/html;charset=utf-8");//设置发送给浏览器的内容编码,也会告诉浏览器使用 哪种编码方式去打开页面。
十六、web.xml(这里只列出常用的) <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_2_5.xsd"> <!-- 此xml用的是.xsd即schema约束,所以下面的servlet或者监听器等等顺序都是可以互换的 --> <!-- 设置一个全局的参数,每个Servlet或jsp都能访问到 --> <context-param> <description>描述信息 </description> <param-name>encoding</param-name> <param-value>utf-8</param-value> </context-param> <!-- Servlet配置项 --> <servlet> <description>描述信息</description> <servlet-name>XmlServlet</servlet-name> <servlet-class>com.mwt.Servlet.XmlServlet</servlet-class> <!-- 专门给指定的Servlet添加参数,别的Servlet无法访问。 --> <init-param> <param-name>username</param-name> <param-value>宝宝</param-value> </init-param> <!-- 设置Servlet加载时间,整数或者0指启动服务时就实例化Servlet对象,负数或没设置则请求时才创建对象 --> <load-on-startup>8</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XmlServlet</servlet-name> <url-pattern>/XmlServlet</url-pattern> </servlet-mapping> <!-- 第一个被加载:监听器配置项 --> <listener> <listener-class>com.mwt.listener.ServletContext_Listener</listener-class> </listener> <!-- 过滤器设置(仅次于监听器加载) --> <filter> <filter-name>FilterTest</filter-name> <filter-class>com.mwt.filter.FilterTest</filter-class> </filter> <filter-mapping> <filter-name>FilterTest</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- HttpSession会话的有效时间设置(单位分钟,不能是小数)这里设置的时间意思是一分钟不访问此session后就过期,如果一直在用就不会过期。 --> <session-config> <session-timeout>1</session-timeout> </session-config> <!-- 配置404(没有访问的页面时) --> <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <!-- 配置访问该web应用时的欢迎页面(找到index1就不会再找其他排在它后面的页面即index2) --> <welcome-file-list> <welcome-file>index1.jsp</welcome-file> <welcome-file>index2.jsp</welcome-file> </welcome-file-list> </web-app>
补充: response.setContentType("text/html;charset=UTF-8");//默认响应输出编码:iiso8859-1,所以转下码。 response.getWriter().print("<script language='javascript'>alert('账号或密码不正确!');location.href='login.jsp';</script>"); response.getWriter().close();//这句话鸡巴真重要,害的我半天不执行脚本! 切记:以后用完流后最好把它关了。
|