02.jsp复习

2023-12-13 07:19:45

1.servlet调用流程

init只执行一次
service(包含get和post)
destroy(服务器关闭就销毁)

2.共享变量(在servlet继承类写的变量)

   使用doGet/doPost可以降低服务器压力,不要service()
      if(getMethod.equals("get")) //doGet(); /多一个判断
      else if
      else 

3.携带第一次请求的数据

 request.getRequestDispatcher("showMessage").forward(request, response);

4.MVC

      Model javaBean
      View JSP  展示
      Controller 负责计算 servlet 结果放在javaBean
       //request和response 设置编码集
     request.setAttribute("bean",bean);
      //然后请求转发
     //必须是request,如果是page,request无法被转发
        <jsp:usebean id="bean" class="com.aa.bean"  scope="request"/>
            <jsp:getProperty name="bean" property="id" />
           getServletContext().setAttrxxxx //得到application
         PageContext.setxxx

 <jsp:useBean id="msg" class="bean.MessageBean" scope="application"></jsp:useBean>  //和set最好用于页面配合,set可能得不到值

5.连接mysql

   //放驱动到tomcat/lib  jdk/jre/lib/ext myeclipse的extended jre
    Class.forName("com.mysql.jdbc.Driver")
   //时间区域设置?useSSL=false&serverTimeZone=GMT

6.滚动查询

//不开启就不能修改指针
//ResultSet.TYPE_SCROLL_SENSITIVE可上下移动,并且可以更改rs, forward向下移动
rs=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE)//ResultSet.CONCUR_UPDATABLE是否回写到数据库
rs.last();//指向最后一行
//怎么得到不重复的int数组,用集合来删除
rs.absolute(1)//定位到指定的数据
  	  Class.forName("com.mysql.jdbc.Driver");
      	 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bookDatabase", "root", "root");
      	Statement stmt= conn.createStatement();
      	Statement stmt1= conn.createStatement();
     int res1= stmt1.executeUpdate("update bookList set publishDate='2019-12-26' where name='大学英语'"); 
     int res2 =  stmt1.executeUpdate("insert into bookList values('2306084657','春天',35.8,'2020-3-20'),('5777564629','冬日', 29.9,'2019-12-23')");
     int res3 =  stmt1.executeUpdate("delete  from bookList where isbn='93529'");
      
             
      rs.updateString(1,"aaa");//rs中更新记录
     rs.updateRow():
     rs.moveToInsertRow();//移动到插入行
     rs.updateString(1,"aaa"); //数据插入行  
     rs.insertRow(): //更新到数据库
     out.println("<br>")

7.预编译语句与事务 要么全部都做

PreparedStatement stmt2= conn.prepareStatement("update booklist set publishDate='2021-6-20' where name='高等数学'");
          con.setAutoCommit(false); //手动提交
          con.commit();   //提交事务
          con.rollback(); //回滚
    //分布式事务,岂不是全部使用mysql,如果
insert into  booklist (isbn,name,price,publishdate)  values('92306084659','数据库原理', 56.9,'2019-2-10')

8.日期处理太麻烦了,

response.getWriter().print("<td>"+rs.getString(4).substring(0,10)+"</td>");
//date不能直接new 过期了
  Date date=new SimpleDateFormat("yyyy-MM-dd").parse(rs.getString(4));
String date1= new SimpleDateFormat("yyyy-MM-dd").format(date);

9.坑爹之处

   1.如果创建新的prepared,rs不能使用,使用处理的数据要立即使用
   2.rs.next必须写
   3.建议变量业务一起写

10.分页

    rs.getColumnCount();//几列
    rs.getColumnName();//得到列名
    //sum=(m%n)==0?(m/n):(m/n+1)
   //当前页 limit(size,size*(curPage-1))

11.数据库连接池(原来的需要手动写url配驱动) 实现DataSource,关闭了就返回到连接池
access是本地的小型数据库

1.在META-INF文件夹创建content.xml(tomcat8要在lib写context.xml文件)

   <Context>
         <Resource name="sourcename"  />  #可以写多个连接池,设置大小驱动,url(&amp &不能直接用 xml规定),账号密码,超时时间
     </Context>
    maxActive(最大活跃连接)
    maxIdle 空闲
    maxWait最大等待时间,毫秒,-1表永久等待

 <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
        maxTotal="100" maxIdle="30" maxWaitMillis="10000"
        username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/bookdatabase"/>

2.java代码

InitialContext initialContext = new InitialContext();
DataSource dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/mydb");
Connection conn = dataSource.getConnection();
Statement stmt=conn.createStatement();
ResultSet rs= stmt.executeQuery("select * from booklist");

13.rs判断空不能使用 null 使用rs.getRow();//得到行

   jsp传给jsp  pageEncoding="UTF-8"不能重复
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

14.文件

   //文件/目录
   new File("C:/aa.txt");//不涉及文件读写,io
   new File("C:/","aa.txt"); //只有文件名,在tomcat/bin
   .getName();//得到文件名
   .isFile()
   .exists()
   request.getServletPath();// /aa.jsp
               .getContextPath; //项目名  /jsp-demo  subString(1)得到名字
   .isDirectory();
   .getAbsolutePath();//f为空 为tomcat/bin .indexOf("bin") b的下标,得到tomcat path
   .canRead()
   .length() //大小字节

15.文件读写 可以进行读写

      rf= RandomAccessFile("c:/dir/name","rw");
       .getFilePointer() //文件位置
       .readUTF()
       .length()
       .seek() //跳跃位置
    while((raf=readLine())!=null){
           byte b[]= s.getBytes("iso-8859-1")    
str.append(new String(b,"utf-8"))
str.append(new String(b))
   }  

16.文件上传
//前端form设置enctype,记得设置文件名字,由于低版本servlet不支持Part方法,需要在前端设置url以便得到文件名,post的内容是放在请求题里面的,payload就是请求体,无法直接设置参数进去

   <form id="form" action="upload?filename=" method="post" enctype="multipart/form-data">
     	
     	<br>
     	<input type="file" name="file1" id="file" onclick="getName()" />
     	<a onclick="getName()">xxx</a>
     	<input type="hidden" name="filename" id="filename"/>
     	<input type="submit"  />
    </form>
    
  </body>
</html>
<script>
setInterval( getName,1000);
  function getName(){
   
   	 var file=document.getElementById("file");
   	 var filename=document.getElementById("filename");
   	 var form=document.getElementById("form");
   	 form.action="upload?filename=";
   	 var arr=file.value.split("\\")
   	 	 console.log(arr[arr.length-1]);
   	 	  form.action="upload?filename="+arr[arr.length-1];
   	 	
       
   
   }

</script>

//后端得到流

public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		String filename=request.getParameter("filename");
		String subfix=filename.substring(filename.indexOf("."));
		
		
		response.setContentType("text/html;charset=utf-8");
		InputStream in=request.getInputStream();
		String uuid=UUID.randomUUID().toString();
		RandomAccessFile rFile=new RandomAccessFile("d:/2000/"+uuid+subfix,"rw");
		byte b1[] = new byte[1024];
		int num=-1;
		while((num=in.read(b1))!=-1){
			rFile.write(b1);
		}
		rFile.close();
		response.getWriter().print("文件上传成功");

	
}

17.文件下载。

String path=request.getParameter("filename");
;
String filename=path.substring(path.lastIndexOf("/"), path.length());
response.setHeader("Content-disposition","attachment;filename="+filename );
File f=new File(path);
FileInputStream fis=new FileInputStream(f);
OutputStream os=response.getOutputStream();
int b;
while((b=fis.read())!=-1){
	os.write(b);
	
}
os.close();
fis.close();

18.坑

servlet乱码
response.setContentType("text/html; charset=utf-8");

jsp代码是先执行java代码还是页面代码? 先执行页面渲染在执行java代码
tomcat启动慢删除几个项目,因为webapps文件夹会部署几个项目,如果要进一步提升速度要jvm调优,和调整线程池测试

19.错题

关于JavaBean正确的说法是:( A )

A、Java文件与Bean所定义的类名可以不同,但一定要注意区分字母的大小写

B、在JSP文件中引用Bean,其实就是用jsp:useBean语句 //使用java代码也可以,不一定要标签

C、被引用的Bean文件的文件名后缀为.java //class

D、Bean文件放在任何目录下都可以被引用

2.没有param不能设置属性值

下面哪项是错误的设置Bean属性值的方法( B )

A、<jsp:setProperty name=“beanInstanceName” property= “*” />

B、<jsp:setProperty name=“beanInstanceName” property=“propertyName”/>

C、<jsp:setPropertyname=“beanInstanceName” property=“propertyName” param=“parameterName”/>

D、<jsp:setProperty name= “beanInstanceName” property= * value={string | <%= expression %>} />

  1. Model和封装都可以 ,定义是Model,作用是封装
    在MVC设计模式中,JavaBean的作用是(C)。

A、Controller

B、Model

C、业务数据的封装

D、View

4.到期选session
( B )范围将使Bean一直保留到其到期或被删除为止。

A、page

B、session

C、application

D、request

JSP开发网站的两种模式分为___和___。

正确答案:

第一空:
jsp+javabean

第二空:
jsp+javabean+servlet

如果你只希望你的Javabean在当前页面有效,应该设置___。

正确答案:

第一空:
scope=“page”

7.公用目录是WEB-INF 或 public ,私有目录是src目录(编译后)

Javabean的部署有两种方式,一种是公有目录下,一种是私有目录下。(对)

文章来源:https://blog.csdn.net/weixin_47039303/article/details/134896652
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。