**
坚持每天写笔记记录Java web学习过程
**
2019.08.12
安装IntelliJ IDEA
下载地址:http://www.jetbrains.com/idea/#chooseYourEdition
破解码地址:http://idea.lanyus.com/
在host文件中加入
0.0.0.0 account.jetbrains.com
0.0.0.0 www.jetbrains.com
下载Tomcat并部署
下载地址:http://tomcat.apache.org/download-80.cgi
bin文件下startup.bat启动服务
shutdown.bat关闭服务
bin文件夹(脚本文件)
conf文件夹(配置目录)
lib文件夹(依赖的jar包)
webapps文件夹(web项目目录)
work文件夹(tomcat处理jsp页面工作目录)
了解HTTP
超文本传输协议用于定义客户端浏览器和和服务器之间交换数据的过程
请求-相应模型
HTTP请求协议:请求行、请求头、请求体
HTTP响应协议:响应行、响应头、响应体
Servlet技术
功能:交互式的浏览和修改数据,生成动态Web内容,处理和解析HTTP请求参数
编写过程:
- 创建一个类继承HttpServlet
- 复写HttpServlet中的doGet和doPost方法
- 配置web.xml文件
- 部署项目并通过浏览器访问
配置文件
<servlet>
<servlet-name>类名</servlet-name>
<servlet-class>servlet类所在路径</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>类名</servlet-name>
<url-pattern>自定义路径</url-pattern>
</servlet-mapping>
Servlet3.0 不需要写配置文件,只需要在@webServlet中添加url:
@WebServlet(name = "testServlet", urlPatterns = “自定义路径”)
!问题:
第一次继承HttpServlet时出现can’t resolve symbol servlet的错误
原因是没有导入servlet-api.jar
解决方法是快捷键F4进入Libraries,servlet-api.jar在tomcat的lib目录中
2019.08.13
HttpServletRequest
常用方法:
- getRequestURL方法返回客户端发出请求时的完整URL
- getRequestURI方法返回请求行中的资源名部分
- getQueryString方法返回请求行中的参数部分(参数名+值)
- getRemoteAddr方法返回发出请求的客户机的IP地址
- getRemoteHost方法返回发出请求的客户机的完整主机名
- getRemotePort方法返回web服务器所使用的网络端口号
- getLocalPort方法返回web服务器所使用的网络端口号
- getLocalAddr方法返回web服务器的IP地址
- getLocalName方法返回web服务器的主机名
获取客户端请求参数方法:
- String getParameter(String name):通过指定名称获取参数值;
- String[] getParameterValues(String name):通过指定名称获取参数值数组;
- Enumeration getParameterNames():获取所有参数的名字;
- Map getParameterMap():获取所有参数对应的Map,其中key为参数名,value为参数值
HttpServletResponse
- HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。
- 定义了一系列描述HTTP状态码的常量
- 在service()方法内部调用HttpServletResponse对象的各种方法来创建响应消息,响应消息包括HTTP版本,状态码和一系列相关提示信息。常见状态码见链接HTTP常见状态码大全
实战:切换验证码
html页面
<body>
<h2>切换验证码</h2>
<script>
function changeImageCode() {
document.getElementById('btn').isDisabled=true;
document.getElementById('identity').src='code?ts='+new Date().getTime();
}
</script>
<img src="code" id="identity" onload="btn.disable=false;" style="cursor: pointer; vertical-align: text-top" />
<input type="button" id="btn" value="看不清更换验证码" onclick="changeImageCode()" style="vertical-align:text-top "/>
</body>
VerifyCodeServlet代码
@WebServlet(name = "VerifyCodeServlet", urlPatterns = "/code")
public class VerifyCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 30;
String data="abcdejksnfkgwglemrg12346789";
Random random=new Random();
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics graphics=image.getGraphics();
graphics.setColor(Color.gray);
graphics.fillRect(0,0,width,height);
graphics.setColor(Color.black);
for(int i=0; i<4; i++){
int position=random.nextInt(data.length());
String randomStr=data.substring(position,position+1);
graphics.drawString(randomStr,width/5*(i+1), 15);
}
ImageIO.write(image,"jpg",response.getOutputStream());
}
Servlet生命周期
(第一次访问Servlet)装载Servlet类并创建实例->调用init(Servlet config)初始化Servlet->调用service(ServletRequest, ServletResponse)->执行doGet和doPost->服务器关闭执行destroy()
ServletConfig对象获取Servlet相关配置信息
对应web.xml中
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
ServletContext对象表示当前的web应用环境信息
对应web.xml中
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
利用ServletContext可以实现多个Servlet共享参数,方法如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String data="xiaoming";
this.getServletContext().setAttribute("name",data);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=(String) this.getServletContext().getAttribute("name");
System.out.println(name);
}
方法:
- String getServletName():获取的是中的内容
- ServletContext getServletContext():获取Servlet上下文对象
- String getInitParameter(String):通过名称得到初始化参数的值
- Enumeration getInitParameterNames():得到所有初始化参数名称
Servlet跳转
- 请求转发:浏览器发送request请求给servletA,servletA通过forward转发给servletB、jsp或者其他web资源,然后返回一个response响应给浏览器。方法如下:
request.getRequestDispatcher("目标路径").forward(request,response);
- 重定向:浏览器发送request请求给servletA,servletA返回response响应给浏览器,其中包括状态码302,和一个URL,浏览器根据URL发出request,最后接收到response响应
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location","目标路径");
或者
response.sendRedirect("目标路径");
两者的区别:
请求转发浏览器地址不会改变,请求重定向会改变地址
请求转发只有一个request和一个response,请求重定向有两组
请求转发只需要内部资源名,请求重定向访问内部资源需要在URL中加入项目名称
实战:登录失败跳转页面并提示错误信息,登录成功跳转至百度界面
登录html界面如下
<body>
<form action="login" method="get">
<p>账号:<input type="text" name="name" /></p>
<p>密码:<input type="text" name="passWord" /></p>
<input type="submit" value="登录" />
</form>
</body>
servlet代码
@WebServlet(name = "ServletTest2", urlPatterns = "/login")
public class ServletTest2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName="xiaoming";
String userPassword="123456";
String name= request.getParameter("name");
String password=request.getParameter("passWord");
if(!name.equals(userName)){
request.setAttribute("errorMessage","账户不存在");
request.getRequestDispatcher("/loginError.jsp").forward(request,response); //请求转发
}else if(!password.equals(userPassword)){
request.setAttribute("errorMessage","密码错误");
request.getRequestDispatcher("/loginError.jsp").forward(request,response);
}else{
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); //重定位
response.setHeader("Location","https://www.baidu.com/");
response.sendRedirect("/test_war_exploded/verifyCode.html");
}
}
}
错误界面loginError.jsp
<body>
<h2>用户登录错误界面</h2>
<div>
<%=request.getAttribute("errorMessage")%>
</div>
</body>
2019.08.14
实战:文件下载
web下建立download文件夹,存储下载资源。
DownloadServlet代码如下:
@WebServlet(name = "DownloadServlet",urlPatterns = "/download")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通知浏览器下载文件,而不是浏览
String name = request.getParameter("filename");
String mimeType=this.getServletContext().getMimeType(name);
response.setContentType(mimeType);
response.setHeader("Content-Disposition","attachment;filename="+name);
//浏览文件
/*String realpath= this.getServletContext().getRealPath("download/"+name); //获取文件路径
InputStream in=new FileInputStream(realpath); //写入输入流
ServletOutputStream outputStream=response.getOutputStream();
int len=0;
byte[] buffer=new byte[1024];
while((len=in.read(buffer))>0){
outputStream.write(buffer,0,len); //输出流从缓冲区中读数据
}
in.close();*/
}
}
ps:测试时需要手动在浏览器URL中传参数filename
会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程称为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为:
- Cookie:数据存储在客户端本地,减少服务器端的存储压力,安全性不好,客户端可以清除cookie
- Seesion:将数据存储在服务器端,安全性相对好,增加服务器的压力
cookie的会话流程:
创建cookie
cookieServlet
Cookie cookie=new Cookie("goods","cup");
Cookie cookie1=new Cookie("userName","xiaoming");
cookie.setMaxAge(60*10); //设置cookie保存时间,消除cookie设这个时间为0
cookie.setPath("/test_war_exploded/getCookieServlet"); //设置访问getCookieServlet才携带cookie
response.addCookie(cookie);
response.addCookie(cookie1);
ps:使用Google浏览器开发者工具抓包查看cookie
获取cookie
getCookieServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
String name = cookie.getName();
if(name.equals("userName")){
String cookieValue=cookie.getValue();
response.getWriter().write("userName:"+cookieValue);
}
}
}
实战:记录网站上一次访问时间
TimeServlet
@WebServlet(name = "TimeServlet", urlPatterns = "/time")
public class TimeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Date date=new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd-hh:mm:ss"); //时间格式化
String time = simpleDateFormat.format(date);
Cookie cookie=new Cookie("time",time);
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
response.setContentType("text/html;charset=UTF-8"); //解决乱码问题
Cookie[] cookies=request.getCookies();
String timevalue=null;
for(Cookie cookie1:cookies){
if(cookie1.getName().equals("time")){
timevalue=cookie1.getValue();
}
}
if(timevalue==null){
response.getWriter().write("欢迎您访问");
}else{
response.getWriter().write("您上次访问网站的时间是:"+timevalue);
}
}
}
Session的会话流程
Session为每个客户端创建一块内存空间存储客户的数据,客户端需要每次都携带一个标识ID去服务器中寻找自己的内存空间。是基于cookie的,Cookie存储客户的唯一标识JSESSIONID
2019.08.15
实例:简单实现模拟购物车功能
addCart.html
<center>
<h1>商品列表</h1>
<a href="/test_war_exploded/addCart?name=杯子">杯子</a><br/>
<a href="/test_war_exploded/addCart?name=书包">书包</a><br/>
<a href="/test_war_exploded/addCart?name=笔记本">笔记本</a><br/>
</center>
getCartServlet
@WebServlet(name = "getCartServlet", urlPatterns = "/getCart")
public class getCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();
List<String> list=(List<String>) session.getAttribute("list");
response.setContentType("text/html;charset=UTF-8");
for(String s:list){
response.getWriter().write(s+"<br/>");
}
}
}
addCartServlet
@WebServlet(name = "addCartServlet",urlPatterns = "/addCart")
public class addCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");
HttpSession session=request.getSession();
List list=(List) session.getAttribute("list");
if(list==null){
list=new ArrayList();
}
list.add(name);
session.setAttribute("list",list);
Cookie cookie= new Cookie("JESESSION",session.getId());
cookie.setMaxAge(60*60*24);
cookie.setPath("/test_war_exploded");
response.addCookie(cookie);
}
}
2019.08.16
JSP简介
JSP用于显示数据和获取数据,JPS作为请求页面,显示表单或者超链接;作为请求结束页面,显示数据
而Sevlet是数据的中间处理环节
jsp=html+java脚本+jsp标签
3种java脚本
<%…%>:用于写java代码片段
<%=…%>:用于输出表达式
<%!..%>:用于声明一个成员变量
jsp注释
<%–…--%> 此种注释仅在jsp文件中显示
jsp九大隐式对象
- out(JspWriter):等同与response.getWriter(),用来向客户端发送文本数据
- config(ServletConfig):对应“真身”中的ServletConfig
- page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型
- pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象
- exception(Throwable):只有在错误页面中可以使用这个对象
- request(HttpServletRequest):即HttpServletRequest类的对象
- response(HttpServletResponse):即HttpServletResponse类的对象
- application(ServletContext):即ServletContext类的对象
- session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session
四大域
- page域:当前jsp页面
- request域:一次请求
- session:一次会话
- application:整个web应用
jsp标签
- 页面包含:
静态包含:<%@include file=“被包含的页面”/>
动态包含:<jsp:include page=“被包含的页面”/> - 请求转发:<jsp:forward page=“要转发的资源”/>
EL表达式
${pageScope/ requestScope/ sessionScope/ applicationScope.参数名} 获取域中数据
EL内置对象
-
pageScope,requestScope,sessionScope,applicationScope 获取JSP域中对象
-
param,paramValues 接收参数
相当于request.getParameter() request.getParameterValues() -
header,headerValues 获取请求头信息
相当于request.getHeader(name) -
initParam 获取全局初始化参数
相当于this.getServletContext().getInitParameter(name) -
cookie WEB开发中cookie
相当于request.getCookies()–>cookie.getName()–>cookie.getValue() -
pageContext WEB开发中的pageContext
获得其他八大对象
JSTL
JSP标准标签库,含有五个子库
核心标签库(core)
下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
将lib中的jstl.jar 和standard.jar加入到项目中
settings中Schemas and DTDs中
URI中填写链接http://java.sun.com/jsp/jstl/core
file选择tld文件夹中的c.tld
最后在jsp页面中添加<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
2019.08.20
监听器Listener
按监听对象分类:
- ServletContextListener
- HttpSessionLisener
- ServletRequestLisener
监听对象属性的增加、修改和删除:
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
各监听器调用时机:
ServletContextLisener:servlet容器启动和关闭
HttpSessionLisener:调用getSession()创建session对象时调用
ServletRequestLisener:每次发起请求时都会调用
过滤器Filter