文章目录
request对象补充
作用域:在某个规定内进行存值,取值
request的作用域:在当前次的请求中有效,不同请求的作用域内设置的值是不相通的
常规的方法:
req.setAttribute("kk","你好");//在Request作用域设置值,是以键值对的方式来进行存储,就类似于一个Map对象
req.getAttribute("kk");//获取Request作用域的值,根据键来获取值
req.removeAttribute("kk");//移除作用域的值,根据键来进行删除
//转发是在服务器内部完成的
req.getRequestDispatcher("welco.jsp");//只有在服务器内部之间转换的才能获取到值
注意点: req.getParameter("name值") 这种方式是获取不到req.setAttribute("键","值") 的值,它一般用于获取from表单的值,a标签?后拼接的参数的值
ServletConfig对象
作用域:获取当前servlet的配置信息,用于在当前servlet进行存值,取值
获取这个对象
ServletConfig servletConfig = this.getServletConfig();//this代表当前的servlet,获取servletConfig的对象
//理解:一个项目只有一个xml配置,但是有你可以有多个servlet
//而不同的servlet调用getServletConfig(),获取到的ServletConfig是不一样的,内容是,
// 当前servlet的配置和设置在xml内部的公共部分(也就是所有servlet都可以操作的)的属性和值
//所以,config对象可以获取自己的servlet的名字和设置的属性方法,也就是当前servlet的所有配置
常用方法:获取xml配置
ServletConfig servletConfig = this.getServletConfig();
String name = servletConfig.getInitParameter("name");//获取xml配置指定name的paramter值
System.out.println(name);
String servletName = servletConfig.getServletName();
System.out.println("servlet的名称" + servletName);//获取当前servlet的名称
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();//获取xml配置指定name的paramter一组值
while (initParameterNames.hasMoreElements()) {//使用迭代器
String s = initParameterNames.nextElement();
System.out.println(s + ":" + servletConfig.getInitParameter(s));
}
获取的xml配置信息
<context-param>
<param-name>tt</param-name>
<param-value>ll</param-value>
</context-param>
<context-param>
<param-name>ff</param-name>
<param-value>kk</param-value>
</context-param>
ServletContext上下文对象(唯一的全局对象)
上下文对象,上可以访问发布到服务器的文件数据,下可以访问到项目下的xml配置文件的内容
作用域:作用域比较大,生命周期是随着服务器的开始而创建,服务器销毁,也被销毁
用途:1. 可以进行存取值,2.获取到全局的配置
获取这个对象的方式
第一种:
ServletContext servletContext = this.getServletContext();
第二种:
ServletContext servletContext = req.getServletContext();
两种方式都是获取同一个对象ServletContext对象
常规的方法:
servletContext.setAttribute("kkk","wewe");是以键值对的方式来进行存储,就类似于一个Map对象
servletContext.getAttribute("kkk");根据键来获取值
servletContext.removeAttribute("kkk");根据键来进行删除
xml配置文件
<context-param>
<param-name>tt</param-name>
<param-value>ll</param-value>
</context-param>
<context-param>
<param-name>ff</param-name>
<param-value>kk</param-value>
</context-param>
在配置文件里配置好 <context-param>
//获取配置文件的内容
String initParameter = servletContext.getInitParameter("contextName");//获取单个xml配置
System.out.println(initParameter);
Enumeration<String> initParameterNames = servletContext.getInitParameterNames();//获取多个xml设置
while (initParameterNames.hasMoreElements()){
String s = initParameterNames.nextElement();
String initParameter1 = servletContext.getInitParameter(s);
System.out.println(initParameter1);
}
获取服务器的一些配置信息
sc1.getRealPath("/"); 获取到项目发布到服务器的地址
sc1.getContextPath(); 获取 到项目名的地址
getServerInfo(); 获取服务器的基础信息
获取服务器配置文件的信息
读取发布项目或者说是服务器的配置文件
/* InputStream is = req.getServletContext().getResourceAsStream("/WEB-INF/dbcpconfig.properties");//发布路径
Properties pro = new Properties();
pro.load(is);
System.out.println(pro.getProperty("driverClassName"));*/
InputStream is = req.getServletContext().getResourceAsStream("/dbcpconfig.properties");
//如当前项目,默认访问到artifacts下的day14_war_exploded为根项目
Properties pro = new Properties();
pro.load(is);
System.out.println(pro.getProperty("driverClassName"));
模拟统计网站访问人数
ServletContext servletContext = this.getServletContext();//服务器未关闭则变量就不会被清除
Integer unm = 0;
if (servletContext.getAttribute("unm")!=null){
unm=(Integer) servletContext.getAttribute("unm");
//使用integer接收的原因
//返回的是object对象,所以只能是用int 的包装类integer
}
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
if (name != null && name != "") {
unm++;
servletContext.setAttribute("unm",unm);
writer.write(unm+"");
//写入使用字符串的原因:
//如果写入的参数不是字符串,这个请求就会变为下载
}
writer.close();
一个servlet如何处理多个请求方式
from表单
<form method="post" action="userServlet" enctype="multipart/form-data">
<!--通过声明一个标记来给服务器的servlet判断是那种请求,name相同,值不同-->
<input type="hidden" name="flag" value="登录"/value="注册">
<p>标题:<input type="text" name="username"></p>
<p>提交的图片:<input type="file" name="fileimage"></p>
<input type="submit" value="提交">
</form>
servlet代码
// from 表单还是可以通过name 来进行获取
//通过在表单中声明一个
String flag = req.getParameter("flag");
if("register".equals(flag)){//判断获取的标记的不同是那种请求处理
System.out.println("注册请求");
}else if("login".equals(flag)){
System.out.println("登录请求");
}
针对用户 ,登录 注册,修改用户 删除用户 功能,针对一张表就一个servlet,一张表对应一个实体
重定向 ,转发区别
写法:
resp.sendRedirect("index.jsp"); 重定向
req.getRequestDispatcher("welcome.jsp").forward(req,resp); 转发 第一个参数是转发的路径 forward(req,resp) ==>固定的写法(记住要加上)
区别:
转发与重定向的区别: ==> 转发 重定向
1.一个是req 1.一个是resp
2.在服务器内部执行 2.是在客户端执行
3.一次请求 3.两次请求
4.url 地址是不会发生改变 4.url地址是会发生改变
5.转发可以携带参数 5.一般不适用重定向来携带参数 重定向的传参方式:resp.sendRedirect("welcome.jsp?uname=fujiawei");
A项目跳转B项目是不能使用转发,必须使用重定向 ==> 原因是转发是在服务器内部执行,不会改变地址,A项目跳转到B项目是需要改变地址
6.安全性高 (服务器内部执行) 6.安全性低
7.转发的效率高 7.效率低
8.查询一般使用转发 8.增加成功 删除成功 修改成功
==>原因是如果使用转发,url地址不会发生改变,还是在服务器内部执行,所有可以出现重复提交
==>只需要断开这一次请求,就可以解决这个问题
实现文件的上传
步骤
- 导包 (2个)
注意:此时无法使用getgetParameter获取界面数据,只能通过下面遍历来的数据存入实体类 - 提交表单属性必须要enctype=“multipart/form-data” 必须是这个格式来进行提交 必须是post请求
- 得到上传的路径的文件夹 ==> req.getServletContext().getRealPath("/upload"); ==>不存在就创建 file.mkdirs();
- 判断是否是上传的格式进行上传 ==>ServletFileUpload.isMultipartContent(req);
- 构建其核心对象 ==> FileItemFactory factory = new DiskFileItemFactory();
//实例化这个核心对象
ServletFileUpload servletFileUpload = new ServletFileUpload(factory); - 获取其条目 parseRequest(req); ==》 List
- 调用其方法来判断是普通的文本,或者是文件 ==》 fileItem.isFormField()
- fileItem.write(newFile); 写文件调用这样一个方法 ==>不管是普通文本,还是是文件,都是用过name值来进行获取的
实现代码(后端):注意使用的包都是导入的jar包内的
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//第一步:获取servletcontext对象,取得服务端的存储上传文件的位置
String realPath = this.getServletContext().getRealPath("/upload");
//第二步:判断这个文件是否存在
File file = new File(realPath);
if (!file.exists()) {//如果文件不存在,就把文件包括目录一起创建出来
file.mkdirs();
}
//第三步:使用框架的核心类判断通过这个请求传来的上传内容是否符合文件标准,也就是form表单是否符合
boolean multipartContent = ServletFileUpload.isMultipartContent(req);
if (multipartContent) {//如果符合
//第四步:实例化一个FileItemFactory工厂对象,disk磁盘
FileItemFactory factory = new DiskFileItemFactory();
//第五步:实例化核心对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//第六步通过核心对象获取list的FIleItem集合,也就是input集合
List<FileItem> fileList = null;
try {
fileList = fileUpload.parseRequest(req);//获取到所有的input标签,一个input就是一个文件条目
} catch (FileUploadException e) {
e.printStackTrace();
}
Iterator<FileItem> iterator = fileList.iterator();
while (iterator.hasNext()) {
FileItem next = iterator.next();
//第七步:判断FileItem判断某项是否是普通的表单类型。
if (next.isFormField()) {//译:如果是形成字段
String fieldName = next.getFieldName();//获取文本name的值
System.out.println(fieldName + ":" + next.getString("utf-8"));
} else {//否则该表单项是file 类型的
String FileName = next.getName();//获取到文件的名字
//第八步:构建一个新的FIle对象写入到服务器
File newFile = new File(file, FileName);
try {
next.write(newFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
前端:
<form method="post" action="user" enctype="multipart/form-data">
<p>标题:<input type="text" name="username"></p>
<p>提交的图片:<input type="file" name="fileimage"></p>
<input type="submit" value="提交">
</form>