jsp与javaWeb开发

版权声明: https://blog.csdn.net/weixin_39892293/article/details/79032802
####1.动态网页开发基础####
 ##1.1配置tomcat服务器
1.1.1使用tomcat服务器(需配置环境变量JAVA_HOME)
1.打开bin/startup.dat文件
2.配置域名conf/server.xml文件下配置
3.使用myeclipse打开tomcat:http://localhost:8080/javaweb/MyHtml.html
1.preferences-tomcat-Tomcat 7.x选择tomcat路径(enable)
2.window-show view-servers
3.servers-tomcat 7.x-add deployment(将当前项目部署到tomcat目录下)
4.servers-tomcat 7.x-run servers
5.http://localhost:8080/javaweb/MyHtml.html
6.文件创建在WebRoot下
1.1.2使用命令行运行tomcat
F:\apache-tomcat-7.0.82\bin\startup.bat
1.1.3使用server.eml修改tomcat端口号
1.1.4jsp页面元素
<% %> 编写java代码
<%= %> 表达式 相当于out.print();输出执行结果
<%! %> 声明方法,声明全局变量
1.1.5jsp注释
<!-- html注释 -->
<%-- jsp注释 -->
<%//单行注释-->
<% /* 多行注释 */>
####2.jsp数据交互####
##2.1jsp内置对象##
2.1.1out对象   用于向客户端输出数据
out.print();向ui界面输出
out.write();作为想网页输出html代码块
2.1.2request对象 用于处理客户端请求的数据信息
方法名称 说明
String getParameter(String name) 根据页面表单组件名称获取页面提交数据
String[] getParameterValues(String name) 根据一组以相同名称命名的表单组件提交的数据
void setCharacterEncoding(String charest) 指定每个请求的编码,在调用getParameter方法之前进行设定,可以用于解决中文乱码的问题
RequestDispatcher getRequestDispatcher(String path) 返回一个对象,该对象forward()方法用于转发请求//工程文件不需要写在路径中
web页面中路径如何去写:要项目名的时候给浏览器用如重定向,不要项目名的时候给服务器使用如转发
2.1.3response对象 用于响应客户端请求并向客户端输出信息
方法名称 说明
void addCookic(Cookie cookie) 向客户端添加Cookie
void setContentType(String type) 设置HTTP相应的contentType类型
void setCharacterEncoding(String charest) 设置响应所采用的字符编码类型
void sendRedirect(String location) 将请求重新定位到一个新的URL上 需要设置状态属性 out.write("<script>location.href='地址'</script>")//重定向跳转页面
    //2.转发,地址栏没变,因为只请求一次
request.setAttribute("message", message);
request.getRequestDispatcher("/demo/demo2.jsp").forward(request, response);
登录过滤
if(session.getAttribute("petstore")==null){
response.sendRedirect("/pet_store/ui/login.jsp");
return ;
}
2.1.4session对象 用于记录会话状态的相关信息,在服务器中
方法名称 说明
String getId() 获取sessionid
void setMaxInactiveInterval(int interval) 设定session的非活动时间
int getMaxInactiveInterval() 获取session的有效非活动时间,以秒为单位
void invalidate() 设置session对象失效
void setAttribute(String key,Object value) 以key/value的形式将对象保存到session中
Object getAttribute(String key) 通过key获取session中保存的对象
void removeAttribute(String key) 从session中删除指定key对应的对象
//如果服务器当中有这个用户的session那么就是获得,否则就是创建
在前面需要有session=“false“
HttpSession session=request.getSession();
转换 URLEncoder.encode("哈哈", "utf-8");
不适用cookie而使用session对象
cookie的数据保存在客户端,不安全
cookie保存中文需要特殊处理
cookie在浏览器当中存储有上限
2.1.5include指令
<%@ include file="应用文件路径" %>    //不需要项目名
2.1.6cookie对象
客户端存储技术,cookie数据是保存在客户端的
Cookie cookie=new Cookie("key","value");
response.addCookie(cookie);
cookie.setMaxAge(60*60);
response.addCookie(cookie);
//cookie.setPath("");//设置路径
Cookie[] cookies=request.getCookies();
####3.jsp数据交互(二)####
 ##3.1内置对象application 类似于系统的全局变量,用于实现web应用中的资源共享
方法名称
void setAttribute(String key,Object value) 以key/value的形式将对象存储到application中
Object getAttribute(String key) 通过key获取application中存储的对象
String getRealPath(String path) 返回相对路径的真实路径
 ##其他内置对象
pageContext:提供了在jsp运行时访问和其相关的环境信息的能力,通过pageContext对象可以访问和当前jsp页面相关联的所有作用域,以及一些页面属性
常用方法 说明
ServletRequest getRequest() 获取request对象
ServletResponse getResponse() 获取response对象
HttpSession getSession() 获取session对象
JspWriter getOut() 获取out对象
void setAttribute() 保存属性
Object getAttribute() 获取属性
void include() 请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中
  page:表示当前页面,
  config:用于存放jsp编译后的初始数据
  exception:表示jsp页面运行时产生的异常和错误信息,该对象只有在错误页面(page指定中设定isErrorPage为true的页面)中才能使用


  四个域对象
  pagecontext:只在本页面中存储和获取
  request:一次请求中,只能转发
  session:一次会话
  application:服务器不关闭将永远存在
 ##el表达式
当一个页面中传递一个域如request.setAttribute("key",对象),另一个页面可以用${key.属性}来接收如${key.name}
当url中传递数据时,可以用${param.name},但是不可添加变量
el表达式可以用于运算,三元运算符,empty(判断是否为空)${!empty 对象}


if(false){
}else{
//注册失败,数据回显到注册页面
request.setAttribute("name", "张三");
request.setAttribute("sex", "女");
//模拟
}
<!-- 概念:数据回显
好比:修改--你一点修改回去修改ui让你修改数据,而这个ui会展现原始数据
好比:注册失败--你注册失败会回到注册页面,而这个注册页面还有有你上一次的数据
什么是回显?有数据就提取展现出来,没数据就不显示  if else if
-->
<input type="text" name="user" value="${name}"/>
男:<input type="radio" value="男"
name="sex" ${sex=='男'?'checked':'' }/>
女:<input type="radio" value="女"
name="sex" sex=='女' ? 'checked':'' }/>
${pageContext.request.contextPath}//获得项目名
${list[0].name }
<c:set var="key" value="<h1>哈</h1>" scope="request"></c:set>
<c:out value="${key }" escapeXml="false"></c:out>
我们常会用c标签来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行、偶数行差异;最后一行特殊处理等等。先就varStatus属性常用参数总结下:
${status.index}      输出行号,从0开始。
${status.count}      输出行号,从1开始。
${status.current}   当前这次迭代的(集合中的)项
${status.first}  判断当前项是否为集合中的第一项,返回值为true或false
${status.last}   判断当前项是否为集合中的最后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。


 ##使用jstl配合el表达式
隐式对象:requestScope,pageScope,sessionScope,allicationScope
当一个页面传递集合的时候,另一个页面需要导入jstl.jar和standard.jar包然后
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forEach items="${topics}" var="xx" varStatus="state">
${xx.tid}${xx.tname} ${state.count}
</c:forEach>在本页面中操作时,需要把集合中的内容放到域中
1.if.....elseif...else...
<c:choose>
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
</c:choose>
2.request.removeAttribute()相当于
<c:remove var="key" scope="request"/>
3.重定向跳转页面
context写的是父路径
<c:redirect url="" context="${pageContext.request.contextPaht}"></c:redirect>
####4.使用分层实现业务处理####
 ##4.1JNDI
JNDI的全称是java命名与目录接口
在tomcat中conf\context.xml文件下配置
<Environment name="tjndi" value="hello jndi" type="java.lang.String"/>
在jsp中写入
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
Context ctx=new InitialContext();
String testjndi=(String)ctx.lookup("java:comp/env/tjndi");
out.print(testjndi);
####6.servlet####
##1.配置servlet##继承HttpServlet类
  * servlet==java类==动态网页资源技术
  * GenricServlet实现了servlet接口
  写一个类继承了GenericServlet并调出一些方法:destroy,init,service
  在WebContent-WEB-INF下配置出web。xml文件
  <!-- 设置session在服务器端存活的有效期 -->
 <session-config>
 <session-timeout>10</session-timeout>
 </session-config>
 <!-- 映射 将服务器中的firstServlet这个资源和一个url关联映射-->
 <servlet>
 <servlet-name>cj</servlet-name>
 <!-- control包下的FirstServlet的class文件 -->
 <servlet-class>control.FirstServlet</servlet-class>
 </servlet>


 <servlet-mapping>
 <servlet-name>cj</servlet-name>
 <url-pattern>/first</url-pattern>
 </servlet-mapping>


1.1servlet是单实例多线程,
 生命周期
 1.创建对象--第一次被访问
 2.init初始化--第一次访问
 3.service调用--每一次访问
 4.destroy方法--服务器结束
 HttpServlet的service方法内部判断请求来源,如果是get就调用get方法,如果是post就调用post方法


   1.2 使用新建生成servlet方法,生成doGet和doPost方法,然后在其doGet()方法中输入以下代码
  //设置tomcat的数据为utf-8,传递给浏览器
response.setCharacterEncoding("utf-8");
//设置浏览器的数据格式为html,编码格式为utf-8
response.setContentType("text/html;charset=utf-8");//当输出到网页上的内容是图片的时候写img/png
在servlet中使用jsp重定向的时候需要加项目名,如form表单数据
@WebServlet("/petStoreControl")//使用注解@WebServlet(value="/upload",loadOnStartup=1)
PrintWriter out=response.getWriter();//获取out对象
out.write("<h1>我</h1>");
ServletContext application = request.getServletContext();//获取application对象
HttpSession session=request.getSession;//获取session对象
1.3 MVC+三层架构
jsp(ui--view)
+servlet(control--control)
+javaBean(model--entity+dao+service)
####7.实现分页业务逻辑####
7.1使用查询语句limit来获取结果集,在javaBean中写一个专门用来做分页功能的类,如pageBean,属性有总页数,当前页,结果集,长度
具体代码实现在11-25
 ##7.2文件传输##
1.在form表单上添加enctype="multipart/form-data"//在表单中必须给input添加name属性
//导入commons-iojar和commons-fileuploadjar
String userName=request.getParameter("userName");
//使用jar包去完成获取文件
//1.创建FileItemFactory对象
FileItemFactory factory=new DiskFileItemFactory();
//2.创建ServletFileUpload对象
ServletFileUpload upload=new ServletFileUpload(factory);
upload.setHeaderEncoding("utf-8");
//3.解析form表单提交的所有表单元素
List<FileItem> fileItems=null;
try {
fileItems=upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(fileItems!=null) {
for (FileItem fileItem : fileItems) {
if(fileItem.isFormField()) {
//4.如果是普通的元素,获取该元素的名和值使用,
System.out.println("表单元素的名字"+fileItem.getFieldName());
System.out.println(fileItem.getString("utf-8"));
}else {
//5.如果是文件数据,获取文件名的等参数
String fileName=fileItem.getName();
//以输入流的形式获取
InputStream in=fileItem.getInputStream();
//创建一个本地文件输出流,将用户传递的流信息保存起来
String path=request.getServletContext().getRealPath("/WEB-INF/upload");//request.getContextPath()获取项目名
System.out.println(path);
//6.保存文件数据到服务器
FileOutputStream out=new FileOutputStream(path+"/"+fileName);
byte[] b=new byte[1024];
int line=0;
while((line=in.read(b))!=-1) {
out.write(b,0,line);
}
in.close();
out.close();
//删除临时文件:因为服务器会吧用户上传的文件偷偷的给你创建一个临时文件
fileItem.delete();
}
}
}
下载
int id=Integer.parseInt(req.getParameter("id"));
//委托业务层做下载
File file=new File(1,"笔记1.txt",req.getServletContext().getRealPath("/WEB-INF/upload/笔记1.txt"));//这个是实体类
/**
* 设置一个响应头,告诉浏览器,请以下载文件方式接收我的响应,,而不是当做text、html展示给用户看
*/
//中文必须用urlEncoding编码
resp.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getFileName(), "utf-8"));
FileInputStream in=new FileInputStream(file.getFilePath());
//getWriter想页面输出文本,同理可以输出文件流
OutputStream out=resp.getOutputStream();
int line=0;
byte[]b=new byte[1024];
while((line=in.read(b))!=-1) {
out.write(b,0,line);
}
####8.过滤器和监听器####
 ##8.1过滤器##
response.getWriter().write("<script></script>");
使用注解@WebFilter(urlPatterns= {"/index.jsp","/file"})
8.1.1生命周期
实现servlet包下的filter
1.创建     在服务器启动的时候被创建,只被实例化一次
2.初始化 在实例化过滤器时会调用init()方法来实现初始化操作,init()方法主要设计用于使过滤器为处理做准备
3.执行过滤,调用doFilter()方法执行过滤器定义的功能
4.销毁 调用destroy()方法,该方法给过滤器以清除其持有的资源的机会
FilterChain.doFilter(Servletrequest, Servletresponse)
过滤器常用的范围是:日志记录,改善性能,安全与会话管理,敏感字过滤
 ##8.2过滤器的定义和使用
解决乱码问题,降低开发成本,提高工作效率
1.定义过滤器
实现Filter接口,在java.servlet包下
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//解决mthod=post时的中文乱码
response.setCharacterEncoding("utf-8");
filter.doFilter(request, response);
解决method=get时候的中文乱码
if(((HttpServletRequest)request).getMethod().equals("get")){
value=new String(value.getBytes("iso-8859-1"),"utf-8");}
2.过滤链
一个目标资源可以被多个过滤器去过滤
顺序:如果用xml方式配置过滤器--从上往下
 如果是注解按照文件名大小
装饰设计模式:23种设计模式之一,解决的问题:对一个对象进行增强,出现在io流框架体系中
例如创建一个类Singer类,有一个sing()方法
创建一个包装类,写一个构造方法把Singer对象传进来,给设置一个private Singer对象,在其方法里写此对象的方法
 ##8.3监听器##
监听器接口 说明
javax.servlet.ServletContextListener 实现该接口可以在Servlet上下文对象初始化或者销毁时得到通知
javax.servlet.ServletContextAttributeListener 实现该接口可以在Servlet上下文对象的属性列表发生变化时得到通知
javax.servlet.http.HttpSessionListener 实现该接口可以在session创建后或者失效前得到通知
javax.servlet.http.HttpSessionActivationListener 实现该接口的对象如果绑定到session中,当session被钝化或者激活时,Servlet容器将通知该对象
javax.servlet.http.HttpSessionAttributeListener 实现该接口可以在session中的属性列表发生变化时得到通知
javax.servlet.http.HttpSessionBindingListener 实现该接口的对象在绑定session或者从session中删除时会得到通知
javax.servlet.ServletRequestListener 实现该接口可以在请求对象初始化时或者销毁时得到通知
javax.servlet.ServletRequestAttribute 实现该接口可以在请求对象中的属性发生变化时得到通知
在application中可以利用其特性,将页面不常用的可存储,提高带宽
 可以利用销毁来实现同时在线数量 HttpSession session=req.getSession();
session.setMaxInactiveInterval(30);
注意使用注解
感知型监听器
实体类继承HttpSessionBindingListener,当在session中添加该实体类时,触发 valueBound(HttpSessionBindingEvent arg0),移除时触发valueUnbound(HttpSessionBindingEvent arg0)
当另一台电脑访问当前电脑时,可以写ip地址去访问部署在Tomcat的文件
 ##8.4钝化和活化##
钝化在META-INF下创建一个context.xml文件
写入<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager"
maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore"
directory="d:/session/" />
</Manager>


</Context>
<!--
减轻服务器压力:
长时间处于空闲状态session但是有没有超过30分钟,把他从服务器缓存当中移到本地文件当中去(钝化)
下一次访问在反序列化将session再活化到内存当中为用户服务。
没有服务器:将web应用托管到     阿里云, 百度云 ,新浪云
一个服务器:应用服务器+数据库服务器:localhost改成数据库服务器的ip地址
负载均衡:多台应用服务器 :Ningx
-->
并将实体类序列化,在将该实体类传入session中时,将触发如果在规定时间内不对该操作时,将在d:session下创建一个文件,保存该信息,
减轻服务器的负担
####9.ajax####
html页面使用jq编写ajax
$("#userName").blur(function(){
var userName=$(this).val();
$.ajax({
"url":"/12-01/first",
"data":"userName="+userName,//null
"type":"get",
"success":function(data){
if(data=="true"){
alert("可以使用");
}else{
alert("重名了");
}
}
});
})
servlet中
//验证
String userName=req.getParameter("userName");
System.out.println(userName);
String result="true";
//调用业务层方法
if("zy".equals(userName)) {
result="false";
System.out.println("sdfsdaf");
}
resp.getWriter().write(result);
 ##9.1XMLHttpRequest##
9.1.1创建XMLHttpRequest对象
老版本
XMLHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
新版本
XMLHttpRequest=new XMLHttpRequest();
9.1.2常用的属性和方法
方法名称 说明
open(String method,String url,boolean async,String user,String password) 用于创建一个新的HTTP请求
参数method:设置HTTP请求方式,如get,post
参数url:请求的url地址
参数async:可选,指定次请求是否为异步方法,默认为true
参数user:可选,如果服务器需要验证,此处需要指定用户名,否则会弹出验证窗口
参数pssword:可选,验证信息的密码,如果用户名为空,此值将被忽略


send(String data) 发送请求到服务器端
参数data:字符串类型,通过次请求发送的数据,此参数值取决于open方法中的
method参数,如果是post,可以指定该参数,如果是get,该参数为null


abort() 取消当前请求


setRequestHeader(String header,String value) 单独设置请求的某个HTTP头信息
参数header:要指定的HTTP头名称
参数value:要指定的HTTP头名称对应的值


GetResponseHeader(String header) 从响应中获取指定的HTTP头信息,参数header:要指定的HTTP头


GetAllResponseHeaders() 获取响应的所有的HTTP头信息


属性名称 说明
onreadystatechange 设置回调函数
readyState 返回请求的当前状态
常用值:0----未初始化
1----开始发送请求
2----请求发送完成
3----开始读取响应
4----读取响应结束
status 返回当前请求的HTTP状态码
常用值:200----正确返回
404----找不到访问对象
statusText 返回当前请求的响应行状态
responseText 以文本形式获取响应值
responseXML 以XML形式获取响应值,并且解析成DOM对象返回
 ##9.2定义json对象
语法:var JSON对象={name:value,name:value.....};
JSON数据以名/值对的格式书写,name必须是字符串由双引号阔起来,value可以是String,Number,boolean,null,对象,数组


 ##9.3使用jQuery实现ajax
9.3.1$.ajax()方法
参数 类型 说明
url String 发送请求的地址,默认为当前页地址
type String 请求方式(post或Get,默认为Get),1.9.0之后使用method代替ytpe
data String或PlainObject或Array 发送到服务器的数据
dataType String 预期服务器返回的数据类型,可用的类型有XML,HTML,Script,JSON,Text


beforeSend Function(jqXHR jqxhr,PlainObject settings) 发送请求前调用的函数,可用于设置请求头等,返回false将终止请求
参数jqxhr:可选,jaxhr是XMLHttpRequest的超集
参数settings:可选,当前ajax()方法的settings对象


success Function(任意类型 result,String textStatus,jqXHR jqxhr)请求成功后调用的函数
参数result:可选,由服务器返回的数据
参数textStatus:可选,描述请求状态的字符串
参数jqxhr:可选


error Function(jqXHR jqxhr,String textStatus,String errorThrown)   请求失败时被调用的函数
参数jqxhr:可选
参数textStatus:可选,错误信息
参数errorThrown:可选,文本描述的HTTP状态


complete Function(jqXHR jqxhr,String textStatus) 请求完成后调用的函数
参数jqxhr:可选
参数textStatus:可选,描述请求的HTTP状态


timeout Number    设置请求超时时间
global Boolean 默认为true,表示是否触发全局Ajax事件








$(":button").click(function(){
//将表单数据变成字符串 userName=xx&password=yy
var formData=$("form").serialize();
//alert(formData);
//登录验证
$.ajax({
url:"/12-01/login",
data:formData,
type:"post",
dataType:"json",
success:function(data){
if(data=="true"){
console.log("登录成功");
location.href="/12-01/html/index.html";
}else{
console.log(data);
data=jQuery.parseJSON(data);
console.log(data);
for(var i in data){//i是下标,是属性名
console.log(data[i]);
document.write(data[i].id+data[i].name+data[i].date);
}
}
},
error:function(e){
console.log(e);
}
})
})




猜你喜欢

转载自blog.csdn.net/weixin_39892293/article/details/79032802