关于学习JavaWeb的整理
这段时间学习了JavaWeb的一些东西,现在整理下来方便以后复习或者供给大家学习参考,如果有不对的地方希望大家指正,我会虚心接受.
1. Tomcat
首先是安装配置Tomcat.
改变字符集,解决控制台乱码的问题,tomcat安装目录->conf->logging.properties
java.util.logging.ConsoleHandler.encoding = GBK
改端口,解决端口占用问题,tomcat安装目录->server.xml
<Connector URIEncoding="UTF-8" port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
port=“8080” //8080为你想要改成的端口
另外,在java使用tomcat的时候,外就不要手动开启tomcat了,这样也会占用端口.
我遇到过,当时不知道,显得我很傻.
2.Servlet
实际上就是一段java代码,接收客户请求,处理客户请求,反馈请求结果.
层级关系
TestServlet(自己写的) 继承 HttpServlet 继承 GenericServlet 实现 Servlet.
两大类
HttpServletRequest 请求类
HttpServletResponse 响应类
生命周期
1.实例化 2.初始化 3.请求处理 4.服务终止
在⼀个应⽤程序中,每种Servlet类型只能有⼀个实例。
请求方法
setCharacterEncoding(“utf-8”);设置字符集
String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String
String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
getRequestDispatcher(String path).forward(req,resp) 跳转页面,/文件名 表示同级某个文件
setAttribute(“key”,value) 存值
getAttribute(“key”);//取值后需要向下转型 取值
响应方法
void addCookie(Cookie var1); //给这个响应添加⼀个cookie
void sendRedirect(String var1) ; //发送⼀条响应码,将浏览器跳转到指定的位置,重定向
PrintWriter getWriter() //获得字符流,通过字符流的write(String s)⽅法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
setContentType() 设置响应内容的类型
######转发与重定向
转发:请求不变,一次响应,服务器返回目标路径和内容,request中的数据会丢失
重定向:两次请求,两次响应,服务器第一次响应请求返回目标路径,第二次响应请求返回目标内容
会话session
一个session有多个request
session的数据可以多个页面共享,可以经过重定向
void setAttribute(String key,Object value) 以key/value的形式保存对象值,将数据存储在服务器端
Object getAttribute(String key) 通过key获取对象值
void invalidate() 设置session对象失效
String getId() 获取sessionid,当第⼀次登录成功后,session会产⽣⼀个唯⼀的id,浏览器之后访问时如果发现id值还是之前id,那么说明 当前访问的属于同⼀个会话
void setMaxInactiveInterval(int interval) 设定session的⾮活动时间
int getMaxInactiveInterval() 获 取session的有效⾮活动时间(以秒为单位),默认的有效时间:30分钟
void removeAttribute(String key) 从session中删除指定名称(key)所对应的对象
让session失效的⽅式
(1)invalidate() (2)removeAttribute("key") (3)直接关闭浏览器。
两种配置servlet的方式
在Xml文件中配置
<servlet>
<servlet-name>⾃定义名称</servlet-name>
<servlet-class>处理请求的类的完整路径</servlet-class>
</servlet>
<servlet-mapping><!-- mapping 表示映射 -->
<servlet-name>⾃定义名称</servlet-name>
<url-pattern>请求名</url-pattern>
</servlet-mapping>
通过注解配置
@WebServlet(name = "servletname",urlPatterns = "/user/test")
请求地址记得前面加一个/
3.JSP(Java Sever Page)
包括java和html代码,本质上还是servlet
编写方式
声明标签 <%!变量或者⽅法声明%>
表达式标签 <%= 表达式%> 在⻚⾯上显示的效果
程序代码标签 <%java代码%> ⻚⾯上动态展示内容
//html注释,网页查看元素上能看到
<%–注释–> //jsp注释,不能
内置对象
request,response,session,appliction(整个程序运行时间内),page(本页面),out(页面输出),page=this,pageContext,exception
pageContext 对象的作⽤是取得任何范围的参数
request对象的作⽤域为⼀次请求
session 对象是由服务器⾃动创建的与⽤户请求相关的对象。
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应⽤中都有效。
①pageContext:只在一个页面中保存属性,跳转后无效;
②request:只在一次请求中保存属性,服务器跳转后依然有效;
③session:在一次会话范围中,无论如何跳转都有效,但新开浏览器则无效;
④application:在整个服务器上保存,所有用户都可以使用。
exception 对象的作⽤是显示异常信息,只有在包含 isErrorPage=“true” 的⻚⾯中才可以被使⽤,在⼀般的JSP⻚⾯中使⽤该对象将⽆法编译JSP⽂件。errorPage=“错误返回路径”
jsp指令
<%@指令名 属性明=“属性值”%>
page,include,taglib
Page指令为容器提供当前⻚⾯的使⽤说明⼀个JSP⻚⾯可以包含多个page指令
JSP可以通过include指令来包含其他⽂件。被包含的⽂件可以是JSP⽂件、HTML⽂件或⽂本⽂件。包含的⽂件就好像是该JSP⽂件的⼀部分,会被同时编译执⾏。
JSP API允许⽤户⾃定义标签,⼀个⾃定义标签库就是⾃定义标签的集合。 Taglib指令引⼊⼀个⾃定义标签集合的定义,包括库路径、⾃定义标签。
EL表达式
Expression Language
${};
相同变量名不同作用域时,先取用较小作用域的变量
获取指定作用域的变量时,可以使用 作用域名scope.键名 的方式获得
JSTL(Java server pages standarded tag library)
1.核⼼标签是最常⽤的 JSTL标签。引⽤核⼼标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if></c:if>
<c:foreach></c:foreach>
item遍历目标,var每次遍历的数据,varstatus用于获得下标,sta.index物理下标,sta.count逻辑下标
2.fm格式化标签
1、fmt:formatDate 作⽤:将⽇期类型格式化为指定模式的字符串
2、fmt:parseDate 作⽤:⽤于将指定字符串转化为⽇期类型
3、fmt:formatNumber 按照指定格式对数字进⾏格式化
注意,JSP虽然方便java和html一起编写,但是耦合较高,注意使用.
4.过滤器和监听器
过滤器
存在于客户端与服务器之间,用于过滤拦截request和response
执行filter的先后取决于xml文件配置的先后顺序.
使用场景:
防止用户未登录操作,设置编码方式,加密解密,非法文字筛选,下载资源限制
常用方法
init() //当服务器启动时,就启动初始化
doFilter(), //
destroy().
filterChain.doFilter(servletRequest,servletResponse); //调去下一个filter,servlet
监听器
监听某个域对象的状态变化的组件
监听创建于销毁 实现HttpSessionListener
监听存值的变化 实现HttpSessionAttributeListener
5.Ajax(Asynchronous Javascript And XML)
ajax并不是新技术,是一种前后端交互方式.
javaScript和XML的异步操作
特点:在前端不改变request
包含技术
CSS,HTML
DOM模型
XMLHttpRequest和服务器(核心)
Javascript
常用属性
onreadystatechange=function(); 处理服务器响应的函数
readyState 服务器状态状态响应信息
responseText 获得服务器返回的数据
status 获得服务器Http状态码
建议使用jQuery操作更简便
6.JSON(JavaScript Obejct Notation)
前后端交互最理想的一种数据格式
常用方法
JSONObject.fromObject(Object);
JSONObject.toBean(jsonobject,classname);
JSONArray.fromObject(objectArrayList);
JSONArray.toArray(jsonoArray,classname)
7.MVC(model,vision,controller)
后端开发的设计模式
Model
业务逻辑,数据操作
Vision
整理展示
Control
接收请求,业务逻辑委托model
8.文件上传
文件上传与下载
使用步骤
1.引入smartupload.jar包
2.前端准备
<form action="toUpload" method="post" enctype="multipart/form-data" >
书名:<input type="text" name="bookName"/><br>
图片:<input type="file" name="自定义名称"/><br>
<input type="submit" value="提交"/>
</form>
注意:
(1)form标签中要添加enctype属性
(2)提交方式必须是post
3.开始获取数据,保存文件
示例代码
public void upload(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//上传文件
SmartUpload su=new SmartUpload();
//获得pageContext对象
JspFactory factory=JspFactory.getDefaultFactory();
PageContext pagecontext=
factory.
getPageContext(this, request,response,
null,false,1024,true);
su.initialize(pagecontext);
su.setCharset("utf-8");
//实现文件数据的上传
su.upload();
File file = su.getFiles().getFile(0);
//得到文件的基本信息
String filename=file.getFileName();
String type=file.getContentType();
System.out.println("type="+type);
String url="uploadfile/"+filename;
//将上传文件保存到指定目录
file.saveAs(url, SmartUpload.SAVE_VIRTUAL);
request.setAttribute("filename",filename);
String uname=su.getRequest().getParameter("uname");
System.out.println("uname="+uname);
request.getRequestDispatcher("success.jsp").forward(request,
response);
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
注意:
(1)此时如果表单中有其他数据时,不能通过request直接获取,需要通过SmartUpload对象获取
String name=su.getRequest().getParameter(“bookName”);
并且该代码要在SmartUpload操作完成后添加
(2)解决乱码:
new String(name.getBytes(“GBK”),“utf-8”)
文件下载
示例代码
String name=request.getParameter("filename");
String url="uploadfile/"+name;
//将响应的内容设置为通用的二进制流
response.setContentType("application/octet-stream");
//attachment 告诉浏览器以附件的方式下载文件(弹出下载框)
name=URLEncoder.encode(name,"utf-8");
response.addHeader("Content-Disposition","attachment;filename="+name);
request.getRequestDispatcher(url).forward(request, response);
//清空缓冲区:将服务端缓冲区的文件内容,立即权并不传送给客户端
response.flushBuffer();