本文已参与「新人创作礼」活动,一起开启掘金创作之路。
JavaBean
Jsp中实例化JavaBean <%@ page import="xxx" %>
使用 <jsp:useBean id="name" class="classname" scope="范围"> </jsp:useBean>
scope参数有4种 page,request,session,application
JavaBean分为可视化组件和非可视组件
EL 和 JSTL
EL
EL表达式是jsp2.0的新东西,语法是 ${表达式}
若要忽略EL表达式, 设置 <%@page isELignored = "true" %> 忽略当前页面所有el表达式
如果是忽略某一个el表达式,只需要把$转义一下就可以了
EL 表达式的作用:
- 执行运算 比如 ${user==null?"hello":"Wellcome"}
- 获取数据 替换JSP页面中的脚本表达式.
. 运算和 [] 运算什么时候不能互换
名称含有特殊字符,只能使用[]
动态取值只能使用[]
判空运算用 ${empty A}
作用域:
page,request,session,application
分别对应 pagecontext,request,session,application
按照从小到大的顺序查找
找不到返回空字符串,不返回null
访问集合或者数组元素用[]
pagecontext.request.contextpath 得到基础url
JSTL
引入jstl taglib
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
用法:
比如:
<c:out value="${val}"></c:out> // 有vue那内味了
if choose foreach
<c:if test="regx"></c:if>
<c:choose>
<c:when test="reg"> ??? </c:when>
<c:when test="reg"> ??? </c:when>
<c:when test="reg"> ??? </c:when>
<c:otherwise> default </c:otherwise>
</c:choose>
<c:forEach var="临时元素名" begin="开始" end="结束" step="步长"></c:forEach>
<c:forEach items="容器对象" var="容器中元素的临时变量" varStatus="循环状态对象">
</c:foreach>
varStatus有2个值:
1、index:容器中元素的索引,从0开始
2、count:循环次数,从1开始
AJAX
这是什么?
异步数据获取技术 使用 XMLHttpRequest (基础)
基于标准的表示技术,使用XHTML与CSS
动态显示和交互数据,使用DOM
数据互换和操作技术,使用XML和XSLT
JavaScript 融合上述一起
# setp 1
var xhr = new XMLHttpRequest();
IE :
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
# setp 2
xhr.open('get'.'info.jsp',true) 参数2 的url 参数3代表是否异步请求
# setp 3
回调函数处理
xhr.onreadystatechange = function(){
if(xhr.readystate == 4) {
xxx = xhr.resopnseText;
}
}
常见 ready state属性值:
{
0 未初始化,对象已创建,未调用open
1 已初始化
2 发送数据状态(send)
3 数据传送阶段,已收到数据了,但没完全收到
4 完成状态,收到完数据
}
# setp 4
xhr.send([parm]) 传参 get没用东西,但是post有,需要传入的东西parm
文件上传与下载
下载简单,这里记录了上传
验证码
需要用到的类:
java.awt.image.BufferedImage
java.awt.Graphics
javax.imageio.ImageIO
BufferedImage image = new BufferedImage(60,20,BufferedImage,TYPE_INT_RGB);
Graphics g =image.getGraphics();
g.setColor(new Color(150,200,120));
g.fillRect(0, 0, width, height);
Random rnd=new Random();
int randNum=rnd.nextInt(8999)+1000;
String randStr=String.valueOf(randNum);
session.setAttribute("randStr", randStr);// 存入session 做校验
g.setColor(Color.black); //设置数字的颜色
g.setFont(new Font("华文隶书", Font.BOLD , 20)); //设置字体、加粗等
g.drawString(randStr, 10, 17); //绘制,10,17代表的是坐标
for(int i=0;i<100;i++){
int x=rnd.nextInt(width); //横坐标
int y=rnd.nextInt(height); //纵坐标
g.drawOval(x, y, 1, 1); //绘制一个(椭)圆:x,y代表左上角的坐标,后面两个参数代表宽、高
}
ImageIO.write(image,"JPEG",response.getOutputStream());
httpResponse.setHeader("Cache-Control","No-Cache");//设置客户端缓存中不保留副本
response.getOutputStream().close();
out.clear();
out=pageContext.pushBody();
文件上传
com.jspsmart.upload.SmartUpload 负责进行文件上传
com.jspsmart.upload.File 封装了上传的文件对象
上传时注意要把 enctype属性需设置为multipart/form-data method为post
SmartUpload su = new SmartUpload();
su.setMaxFileSize(1024*1024*10); //限定上传文件的大小
su.setTotalMaxFileSize(1024*1024*100); //限定上传所有文件的总大小
su.setAllowedFilesList("jpg,png"); //设定允许上传文件的类型
su.setDeniedFilesList("pdf,mp4"); //限定禁止上传文件的类型(与前者二选一)
su.initialize(getServletConfig(),request,response);
su.upload();
String savep = request.getServletContext().getRealPath("/FILES/");
File file = new File(sava);
if(!file.exits()) file.mkdir();
su.save(savep);
错误码类型:
1015 文件拓展名禁止上传
1010 文件拓展名不是允许上传的类型
1105 大小超过单个文件允许的最大值
1110 上传文件总大小超过所有文件总大小允许的最大值
网络安全
攻击 URL操作攻击,解决办法: 鉴权
SQL 注入 : 例如 1'or' '1' = '1
解决方法: PreparedStatement 或者将预处理好过滤掉
XSS 跨站脚本攻击
SpringMVC
配置:
扫描包
<context:component-scan base-package="Mvc"></context:component-scan>
web.xml
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc.xml</param-value>
</init-param>
</servlet>
用:
Controller 变成servlet
RequestMapping
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- <property name="prefix" value="/review/"></property>-->
<property name="suffix" value=".jsp"></property>
</bean>
配置只对转发有用,重定向没用,视图解析器
如何带数据给servlet
可以选择HttpServletRequest或者Model来带