梦回JSP和Servlet(下)

314 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

JavaBean

image_Mx6eunUhWA.png

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 表达式的作用:

  1. 执行运算 比如 ${user==null?"hello":"Wellcome"}
  2. 获取数据 替换JSP页面中的脚本表达式.

. 运算和 [] 运算什么时候不能互换

名称含有特殊字符,只能使用[]

动态取值只能使用[]

判空运算用 ${empty A}

作用域:

page,request,session,application

分别对应 pagecontext,request,session,application

按照从小到大的顺序查找

找不到返回空字符串,不返回null

访问集合或者数组元素用[]

image_4SlgwLDi6Y.png

pagecontext.request.contextpath 得到基础url

JSTL

引入jstl taglib

 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

用法:

image_EZ8m5ZqGpk.png

比如:

<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 负责进行文件上传

image_Vah7Fce8Th.png

com.jspsmart.upload.File 封装了上传的文件对象

image_ZiG1O8ne2G.png

上传时注意要把 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来带