1. 初始JSP


静态内容: 	html标签 和 样式表 js
小 脚 本: 	 <%%>
表 达 式:   <%=srt%>   向页面输出内容
指    令:   <%@ page %>
标准动作:   <jsp:include/>
声    明:   在jsp页面中声明一个方法<%!%>
注    释:   // /**/ <!-- HTML注释-->

注释之间的区别
 	html 页面中的注释,在F12中是可以看到的
 	java 代码中的注释  在F12中看不到

2. JSP数据交互

	//获取工程根目录
	String path = request.getContextPath();
	//设置读取请求信息的字符编码为UTF-8
	request.setCharacterEncoding("UTF-8");
	//通过表单的name属性,获取对应的值,也可以获取url中的?后面的值
	String name = request.getParamter("name");
	//通过表单的name属性,获取对应的一组值(复选框,下拉列表等)
	String[] name = request.getParamterValues("names");

	post: 方式提交过来的表单,必须在接受页面中通过setCharacterEncoding("UTF-8")进行转码
	get:   方式提交过来的表单,不需要进行进行转码,需在配置文件中进行配置

	//查询字符串应用
	<a href="color.jsp?color=赤色&id=1">赤色</a>
	//防止浏览器从缓存中取数据  ?_=<%=new Date().getTime() %>
	 <link rel="stylesheet" href="css/index.css?_=<%=new Date().getTime() %>">

3. JSP中内置对象

	jsp的内置对象
		1.request  ------ 一次请求
        2.response ------ 一次响应
        3.out		------- 输出,向页面输出
        4.session ------- 一次会话(多次请求)
			(1) session.setMaxInactiveInterval(1000) --设定session的会话时长
        	(2) 当浏览器关闭的时候,保存在session中的值,也会被摧毁
         	(3) 通过removeAttribute去摧毁保存在session中的值
        //target跳转方式
		target='parent';   在浏览器跳转至父级,  (URL)
     	target='路径';	  在框架内跳转指定路径  (框架本身)

4. 数据传输

//回显方式
//下拉菜单回显方式: 		
 $("[name=roleId] [value="+$("[name=hideRoleId]").val()+"]").attr("selected",true);
 $("[name=roleId]").val($("[name=hideRoleId]").val());
        
//文本框回显方式: 
< input type="text" value="<%=userName==null?"":userName%>" name="userName">


<两种处理方式:
		方式一: 隐藏域,作用存储查询出来的信息,然后通过DOM操作,获取隐藏域内容,赋值给下拉列表
		方式二: 自定义属性data, 作用存储查询出来的信息,然后通过DOM操作,获取属性中的值,赋值给下拉列表>

	//提交一个复选框  如果未勾选接收过来的是null
	stu.setMarry(request.getParameter("marry")==null?false:true);
	//多个复选框赋值
	var hobby = $("[name=hideHobby]").val().split(";");
	$("[name=hobby]").val(hobby);	<隐士迭代>
 	//批量删除
	//关于复选框,method只会提交已经选择的复选框; 必须用表单提交
	<input type="checkbox" value="<%=i.getId()%>"  name="boxs"> //设置值
	<%String[] boxs = request.getParameterValues("boxs");%>     //获取值
    
    
 	<!--使用自定义属性赋值 用于select下拉框-->
	$("[name=stuGrade]").val($("[name=stuGrade]").attr("data"));

5. 提交表单事件

//提交表单事件 
$("form").submit(function(){})
//自动触发事件
$("表单名").trigger("submit");

6. 分页查询

<%
	int pageNo = 1;		//页码
	int pageSize = 3;	//显示条数
	int totalCount = dao.getCount();			//总条数
	int totalPage = (totalCount-1)/pageSize+1;	 //总页数
	
	String pageStr = request.getParameter("page");		//获取url中?page的值
	
	//判断并复制
    if(pageStr!=null && !pageStr.equals("")){
		pageNo=Integer.parseInt(pageStr);
    }
	
	int prevPage = pageNo==1?1:pageNo-1;				 //上一个
	int nextPage = pageNo==totalPage?totalPage:pageNo+1;  //下一个
	
%>

全查、条件查询、条件查询高亮显示(a标签)、查看详情、分页查询。添加、修改、删除、批量删除。
新闻发布系统(session会话控制、过滤器、后台搭建、新闻主页)

7. Servlet

<%
	
	@WebServlet("/doBatchDelete.shtml")
public class doBatchDelete extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}


	//地址栏
    /**
     * 实现servlet
     *  1. 创建普通Java类
     *  2. 实现servlet的规范, 继承HttpServlet类
     *  3. 重写service的方法, 用来处理请求
     *  4. 设置注解, 指定访问路径
     */
   	@WebServlet("/Servlet01")
    @WebServlet(name="Servlet01",value="/ser01")
    @WebServlet(name="Servlet01",value={"/ser01","/ser02"})
    @WebServlet(name="Servlet01",urlPatterns="/ser01")
    @WebServlet(name="Servlet01",urlPatterns={"/ser01","/ser02"})

	//编码格式
	
	request.setCharacterEncoding("UTF-8"); 		   // 请求
	response.setCharacterEncoding("UTF-8");		   // 响应
	response.setHeader("content-type","text/html"); // html
	
	//转发和重定向的应用
	转发:一般用于查询操作  如(首页查询,更新查询等)  就是把数据读出来然后在进行赋值,代表两次请求;
		requrset.getRequestDispatcher("/index.jsp").forward(request,respones);	//转发不用加path
    	
	重定向:一般用于增删改   如(增加,删除,修改等); 把数据读出来执行SQL;
    	response.sendRedirect(path+"/indexServlet.shtml");		//重定向一般加上path
	
	
	//HttpRequest常用方法
	// 获取客户端请求的完整URL (从http开始,到?前面结束)
    String url = request.getRequestURL().toString();
    System.out.println("获取客户端请求的完整URL:" + url);
    // 获取客户端请求的部分URL (从站点名开始,到?前面结束)
    String uri = request.getRequestURI();
    System.out.println("获取客户端请求的部分URL:" + uri);
    // 获取请求行中的参数部分
    String queryString = request.getQueryString();
    System.out.println("获取请求行中的参数部分:" + queryString);
    // 获取客户端的请求方式
    String method = request.getMethod();
    System.out.println("获取客户端的请求方式:" + method);
    // 获取HTTP版本号
    String protocol = request.getProtocol();
    System.out.println("获取HTTP版本号:" + protocol);
    // 获取webapp名字 (站点名)
    String webapp = request.getContextPath();
    System.out.println("获取webapp名字:" + webapp);
	// 获取指定名称的参数,返回字符串
    String uname = request.getParameter("uname");
    System.out.println("uname的参数值:" + uname);
    // 获取指定名称参数的所有参数值,返回数组
    String[] hobbys = request.getParameterValues("hobby");
    System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));

	//request作用域
	通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效
        // 设置域对象内容
        request.setAttribute(String name, String value);
        // 获取域对象内容
        request.getAttribute(String name);
        // 删除域对象内容
        request.removeAttribute(String name);
%>	

8. Include包含

    include静态包含
    	格式: <%@ include file='要包含的页面地址' %>
	特点:
		1.将内容进行了直接的替换
		2.静态包含只会生成一个源码文件,最终的内容全部在_jspService方法中(源码文件中)
		3.不能出现同名变量
		4.运行效率高一点点。耦合性较高,不够灵活

<%@ include file="1-header.jsp"%>
<h2>主题内容</h2>
<%@ include file="1-footer.jsp" %>


    include动态包含
		格式: <jsp:include page=“要包含的页面路径”></jsp:include>
		特点;
			1.动态包含相当于方法的调用
			2.动态包含会生成多个源码文件
			3.可以定义同名变量
			4.效率高,耦合度低
			注:当动态包含不需要传递参数时,include双标签之间不要有任何内容, 包含换行和空格
		使用动态包含传递参数
			<jsp:include page="要包含的页面路径">
				<jsp:param name="参数名" value="参数值" />
		         </jsp:include>: name属性不支持表达式,value属性支持表达式
		获取参数: request.getParameter(name);

	<jsp:include page="1-header.jsp"></jsp:include>
	<h2>主题内容</h2>
	<jsp:include page="1-footer.jsp"></jsp:include>
	<%-- 动态包含传递参数 --%>
	<%
		String str = "hello";
		String url = "1-footer.jsp";
	%>
	<jsp:include page="<%=url%>">
		<jsp:param name="uName" value="admin" />
		<jsp:param name="msg" value="<%=str%>" />
	</jsp:include>

9. EL表达式

<%
    EL表达式
    	作用:简化JSP代码
        格式:${域对象的名称}
    操作对象: EL表达式一般操作的是域对象中的值,不能操作局部变量
        操作范围:
    page范围: 在当前页面
    request范围:在一次请求
    session范围:在一次会话
    application范围:在整个应用程序
    注:
    	1.如果EL表达式获取域对象的值为空,默认显示空字符串
        2.EL表达式默认从小到大范围去找,找到即可,如果四个范围都未找到,则显示空字符串
    查找数据时可以使用四个域对象对应的空间对象,分别是:
    	pageScope,requestScope,sessionScope,applicationScope	
%>

<%
	//存储
	pageContext.setAttribute("name","1");
	request.setAttribute("name","2");
	session.setAttribute("name","3");
	application.setAttribute("name","4");	
%>
	//取值
	获取局部变量的值: ${str}
	获取域对象:${name}
	获取指定范围的域对象
		page范围:${pageScope.name}
		request范围:${requestScope.name}
		session范围:${sessionScope.name}
		application范围:${applicationScope.name}
<%--
    EL表达式的使用
    	获取list
         	 获取list的长度 ${list.size()}
			获取list指定下标值  ${list[下标]}:list表示的时限域变量名
		获取map
			获取map中指定key的value
				${map.key}
				${map["key"]}:map代表的是限域变量名
		获取JavaBean
			获取JavaBean中的属性
				${javaBean.属性名}
				${javaBean.get属性名()}}:JavaBean中属性字段必须提供get方法
		  
        empty判断域对象是否为空
            为空: true;
            否则: false;
	--%>
  	<%
	//List
	List<String> list = new ArrayList<String>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    //存储到域对象中
    request.setAttribute("list",list);

    //map集合
    Map map = new HashMap();
    map.put("aaa",1111);
    map.put("bbb",2222);
    map.put("ccc",3333);
    request.setAttribute("map",map);

    //JavaBean对象
    User user = new User();
    user.setUserId(1);
    user.setuName("admin");
    user.setuPwd("admin");
    request.setAttribute("user",user);
	%>
	<h4>获取list</h4>
	获取list的size:${list.size()} <br/>
	获取list的指定下标的值: ${list[1]}<br/>

	<h4>获取Map</h4>
	获取Map指定key的value值: ${map.aaa}----${map["bbb"]}

	<h4>获取JavaBean</h4>
	获取JavaBean对象:${user}<br>
	获取JavaBean中的属性:${user.uName} ----- ${user.getuName()}

	//传递参数
	<a href="5-EL表达式(课堂).jsp?hobby=篮球">一个参数</a>
  	<a href="5-EL表达式(课堂).jsp?name=sun&name=zi&name=yuan">一组参数</a>
	<接受一个参数>
	${param.hobby}<br/>
	<接受一组参数>
	<c:forEach items="${paramValues.name}" var="i">
		${i}<br/>
	</c:forEach>
请求转发(request.getRequsetDispatcher().forward())重定向(request.sendRedirect())
一次请求,数据在request域中共享两次请求,request域中数据不共享
服务器端行为客户端行为
地址栏不会发生变化地址栏发生改变
绝对地址定位到站点后绝对地址可写到http://

10. JSTL标签

<引用标签库>
<%--通过taglib标签引入所需要的标签库 --%>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix-"c" %>

<JSTL的使用>
	1. 下载JSTL所需要的jar包 (standard.jar 和 jstl.jar)
	2. 在项目的web目录下的WEB-INF中新建lib目录.将jar拷贝进来
	3. 选择"file". 再选择"project Structure"
	4. 选择"Modules". 选择右侧的"Dependencies",选择右侧的"+",将对应的lib目录加载进来
	5. 在需要使用标签库的JSP页面通过taglib标签引入指定库
    
<if标签库>
    if 标签
    	格式:
    	<c:if test="<boolean>" var="<string>" scope="<string>">
       	 ...
   		</c:if>
    常用属性:
    	test: 条件判断, 操作的是域对象, 接收返回结果是boolean类型的值    (必要属性)
    	var: 限域变量名(存放在作用域中的变量名), 用来接收判断结果的值      (可选属性)
    	scope: 限域变量名的范围(page、request、session、application) (可选属性):
    	1.标签操作的一般都是域对象
    	2.if标签没有else,如果想要else的效果,就需要设置两个相反的条件
<%
    //设置数据
    request.setAttribute("num",0);
%>
	<c:if test="${num>0}">
		数值大于0 
	</c:if> 
	<c:if test="${num<0}">
		数值小于0 
	</c:if>
    <c:if test="${num>100}" var="flag" scope="request"></c:if>
   	//获取值
	${flag} ---- ${requestScope.flag}
	
   <if-else>
       <!--2、条件标签 if-->
       <c:set value="admin" var="name"></c:set>
       <c:if test="${name =='admin'}" var="isok">
           欢迎 <span>${name}</span> 登录
       </c:if>
       <c:if test="${not isok}">
           请登录
       </c:if>

    
  
    choose 		选择
    when   		场合
	otherwise	否则
<choose标签>
    //语法
    choose、when 和 otherwise 标签
    <c:choose>
        <c:when test="<boolean>">
            ..
        </c:when>
        <c:when test="<boolean>">
            ...
        </c:when>
        ...
        ...
        <c:otherwise>
            ...
        </c:otherwise>
    </c:choose>

    属性:
	    1.choose    标签没有属性
    	2.when      标签只有一个test属性,必须有属性
    	3.otherwise 标签没有属性
    注意:
    	1.choose标签和otherwise标签没有属性,而when标签必须有一个test属性
    	2.choose标签中必须包含至少一个when标签,可以没有otherwise标签(Illegal "choose" without child 																"when" tag)
   	 	3.otherwise标签必须设置在最后一个when标签之后(Illegal "c:when" after "c:otherwise" tag in 													"c:choose" tag.4.choose标签中只能设置when标签与otherwise标签(Illegal child tag in "c:choose" tag: "c:if" 												tag)
    	5.when标签和otherwise标签中可以嵌套其他标签
    	6.otherwise标签会在所有的when标签不执行时才会执行
<%
	request.setAttribute("score",90);
%>
<c:choose>
	<c:when test="${score<60}">
		<h2>你个小渣渣</h2>
	</c:when>
	<c:when test="${score==60}">
		<h2>分不在高,及格就行!</h2>
		<c:if test="${1==1}"></c:if>
	</c:when>
	<c:when test="${scroe>60 && score<80}">
		<h2>哎呦不错哦!</h2>
	</c:when>
	<c:otherwise>
		<h2>你很棒哦!</h2>
		<c:if test="${1==1}">11</c:if>
	</c:otherwise>
</c:choose>
    
<forEach循环>
    forEach标签:
		格式:
			<c:forEach
				items="<object>"
				begin="<int>"
				end="<int>"
				step="<int>"
				var= "<String>"
				varStatus = "<String>"
			></c:forEach>
		属性:
			begin:  开始数
			end:    结束数
			step:   间隔数
			var:    限于变量名,用来接收当前遍历的成员
			items:  要循环的数据<数组,List,Map等>
		1.迭代主体内容多次
			<c:forEach begin="开始数" end="结束数" step="间隔数" var="限域变量名"></c:forEach>
			相当于Java中的for....int
			for(int i=0;i<10;i++){}
		2.循环
			<c:forEach items="要被循环的数据" var="限域变量名"></c:forEach>
			相当于java中的foreach
			foreach(String str:list){}
    
    <!-- 迭代主体内容多次 -->
	<c:forEach var="i" begin="1" end="10" step="1">
		${i}&nbsp;&nbsp;
	</c:forEach>
    <!-- 迭代详细内容 -->
    <c:forEach items="${list}" var="item" varStatus="itemp">
         元素内容:   ${item}
         元素下标:   ${itemp.index}
         第几个元素: ${itemp.count}
         是否时首次: ${itemp.first}
         是否时尾次: ${itemp.last}
    </c:forEach>
    <!-- 循环List集合 -->
    <c:forEach items="${list}" var="i">
		${i} &nbsp;&nbsp;&nbsp;
	</c:forEach>
    <!-- 循环Map -->
    <C:forEach items="${map}" var="i">
		${i.key}&nbsp;${i.value}<br/>
	</C:forEach>
    <!-- 循环对象集合 -->
    <c:if test="${!empty list}">
    	<c:forEach items="${list}" var="i">
        	${i.id}
        </c:forEach>
    </c:if>

11. ajax的简单应用


//方式一: 原始javascript操作ajax
function checkName(result){

	//步骤一: 创建ajax的核心对象XMLHttpRequest
	var xhr = new XMLHttpRequest();

	//步骤二: 调用open方法 true表示使用的是异步请求
 	var url = "checkNames.shtml?name="+result;
	xhr.open("get",url,true);       //true--表示异步   false--表示同步

	//步骤三: 设置回调函数:请求响应成功后,做下一步处理
	xhr.onreadystatechange = function(){
		//进行状态信息的判断
		var state = xhr.readyState;
		//如果state==4,表示成功
		if(state==4){
		    if(xhr.status==200){
		        //接收返回来的数据
			    var data = xhr.responseText;
			    if(data=="false"){
					document.getElementById("spans").innerHTML="用户名已存在";
					document.getElementById("spans").style.color="red";
			    }else{
					document.getElementById("spans").innerHTML="用户名可用";
                      document.getElementById("spans").style.color="green";
			    }
		    }
		}
	}
	//第四步
	xhr.send(null);
}

//方式二: 使用JQuery封装ajax,实现异步请求验证用户名的功能
$(function(){
    //设置失去焦点事件
    $("[name=userName]").blur(function(){
        var uName = $(this).val();
        $.ajax({
            url:"checkNames.shtml",
            type:"post",
            data:{"name",uName},
            success:function(result){
                //result -- 就是查询回来的数据
            	if(result=="true"){
					$("#spans").html("用户名已存在").css("color","red");
					$(".btn-submit").attr("disabled",false);
				}else{
					$("#spans").html("用户名可用").css("color","green");
				   	$(".btn-submit").attr("disabled",true);
				}
            }
        })
    })
})
//方式三: 使用post
 	//优点: 发送方式默认为post,结构简单, 清晰, 容易上手
	//缺点: 只能处理成功的情况
$("[name=userName]").blur(function(){
    var uName=$(this).val();
    $.post("checkNames.shtml",{"name":uName},function(result){
		if(result=="true"){
         	$("#spans").attr("class","glyphicon glyphicon-ok").css("color","green");
            $(".btn-submit").attr("disabled",false);
		}else{
            $("#spans").attr("class","glyphicon glyphicon-remove").css("color","red");
            $(".btn-submit").attr("disabled",true);
		}
    })
})
//方式四: 使用get
 $.get("checkNames.shtml?name="+uName+"",function(result){
     if(result=="true"){
         $("#spans").attr("class","glyphicon glyphicon-ok").css("color","green");
         $(".btn-submit").attr("disabled",false);
     }else{
         $("#spans").attr("class","glyphicon glyphicon-remove").css("color","red");
         $(".btn-submit").attr("disabled",true);
     }
 });

//获取值
String name = request.getParameter("name");
//调用数据访问层对象
UserInfoDao uiDao = new UserInfoDaoImpl();
UserInfo userInfo = uiDao.checkUser(name);
//3.为了不让页面整体刷新,不能采用重定向和请求转发
//只是讲得到的数据返回给JQuery实现ajax的调用处的位置即可
if(userInfo!=null){
    response.getWriter().print(false);
}else{
    response.getWriter().print(true);
}

参数类型说明
urlString发送请求的地址,默认为当前页地址
typeString请求方式,默认为GET
dataString或Array发送到服务器的数据,参数
success任意类型请求成功后调用的函数;参数result:可选,由服务器返回的数据
dataTypeString预期服务器返回的数据类型,包括:XML、HTML、Script、JSON、JSONP、text

12. ajax的应用

//json格式存取值
//定义一个对象数组
var phone=[{
    brand:"华为",
    color:"紫色",
    price:4000
},{
    brand:"小米",
    color:"蓝色",
    price:"5000"
},{
    brand:"苹果",
    color:"白色",
    price:"9000"
}];
//Jqery
$(phone).each(function(i,e){
    console.log();
    //创建标签并添加进去
    $(".uls").append($("<li></li>").html(e.brand+"----"+e.color+"----"+e.price));
})
//html
<ul class="uls"></ul>

//使用fastjson方式
导入包: import com.alibaba.fastjson.JSON;
//1.查询数据
MessageDao mDao = new MessageDaoImpl();
List<Message> mlist = mDao.getAllMessage();
//2.为了不让页面整体刷新,不能采用重定向和请求转发,只是讲得到的数据返回给JQuery实现ajax的调用处的位置即可
//获取的信息不能直接返回,需要讲对象转换为JSON格式的字符串
response.getWriter().print(JSON.toJSONString(mlist));

//异步读取 发送ajax 去查询所有的数据
$.ajax({
    url:"jsonServlet.shtml",
    type:"post",
    success:function(result){
        $("#yibu").empty(); //清空数据
        //将result-json格式的字符串转换回到原来的格式
        result=eval("("+result+")");
        //创建一个select下拉框列表
        var select = $("<select></select>");
        //循环result
        $(result).each(function(i,e){
            //每次循环创建一个li
            $("#yibu").append($("<li></li>").html(e.title+"---"+e.sendDate));
        })
    }
});

//从元素转换JSON格式
JSON.toJSONString(元素);
//从JSON格式转换成元素格式
 result=eval(result);
//设置格式 通过注解给属性设置日期格式
 @JSONField(format = "yyyy-MM-dd HH-mm-ss");
格式说明
JSON.toJSONString(元素)把元素转换成字符串
result=eval(result)转换回原来的格式
@JSONField(format = “yyyy-MM-dd HH-mm-ss”)在实体类属性上加上注解,表示日期类型
@JSONField(serialize = false)数据不读取

13. 过滤器

<%
	/**
     *  过滤器
     *      1. @WebFilter("/s01")       配置拦截的资源路径
	 *     2. doFilter()               方法中需要设置放行,否则无法到达资源
     								(filterChain.doFilter(servletRequest,servletResponse););
     *      3. 如果是过滤器链,则先配置的先执行(首字母在前的先执行),响应时顺序反过来
     */
	//拦截 继承过滤器  servlet下的Filter
	@WebFilter("/s01")	//资源拦截路径
    public class Filter01 implements Filter {
        //初始
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Filter01 init...");
        }
		//执行
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 								FilterChain filterChain) throws IOException, ServletException {
            //doFilter() 放行方法后去做响应拦截的
            System.out.println("Filter01 正在拦截...");
            //放行资源
            filterChain.doFilter(servletRequest,servletResponse);
        	//doFilter() 放行方法前去做请求拦截的
		   System.out.println("Filter02 正在响应...");

        }
		//销毁
        @Override
        public void destroy() {
            System.out.println("Filter01 destroy...");
        }
    }	

%>

14. 文件上传

<form action="index.jsp" method="post" enctype="multipart/form-data">
    
</form>


<%
    @MultipartConfig  				//如果是文件上传,必须要设置该注解!!!
    @WebServlet("/updateServlet")	 //访问注解
    public class uploadServlets extends HttpServlet {
		@Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws 												ServletException, IOException {
         	//处理请求编码格式
            request.setCharacterEncoding("UTF-8");
            //获取普通文本框(通过getParameter(name)方法获取)
            String uName = request.getParameter("uName");
            System.out.println("用户名:"+name);
            
            //得到Part对象
            Part part = request.getPart("myFile");
            //得到上传文件的文件名
            String fileName = part.getSubmittedFileName();
            System.out.println("文件名称:"+fileName);
            
            //设置上传文件的文件要存放的路径
            String upload = request.getServletContext().getRealPath("/upload/");
            System.out.println("路径:"+upload);
            //上传文件
            part.write(upload+fileName);
            
             //调用数据访问层对象
            Student stu = new Student();
            stu.setStudentNo(Integer.parseInt(id));
            stu.setPhotos("upload/"+fileName);

            StudentDao stuDao = new StudentDaoImpl();
            stuDao.updateStudent(stu);

            //重定向
            response.sendRedirect(path+"/indexServlet.shtml");
            
            
        //上传多个文件
        //获取路径
        String realPath = request.getServletContext().getRealPath("/upload/");
        //创建Part对象
        StringBuffer sb = new StringBuffer();
        Collection<Part> parts = request.getParts();
        for (Part part : parts) {
            String fileName = part.getSubmittedFileName();
            if(fileName!=null){
                part.write(realPath+fileName);
                sb.append("upload/"+fileName+";");
                System.out.println("上传成功!");
            }
        }
        sb.deleteCharAt(sb.length()-1);
        System.out.println(sb);
        }


        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws 												ServletException, IOException {
            doGet(req, resp);
        }
    }
%>

15. 清除表单和模态框

 //清除模态框,表单
 $("#form-add-box")[0].reset();

16. serialize() 方法 获取表单中所有信息

<!--
	1. serialize() 方法通过序列化表单值创建 URL 编码文本字符串。
	2. 您可以选择一个或多个表单元素(如输入和/或文本区),或表单元素本身。
	3. 序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中。
-->

$("button").click(function(){
    $("div").text($("form").serialize());
});
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐