Servlet的表单提交
- request对象可以获取页面请求的所有内容。
- 即对于页面提交的表单信息,可以根据控件的name通过request.getParameter(“name”);
- 页面多个复选框的name一般是相同的,产生的信息是个集合,所有通过hobbys=request.getParameterValues(“hobby”)获取后遍历出来。
String username =request.getParameter("username");
String[] hobbys=request.getParameterValues("hobby");
for(String hobby :hobbys){
System.out.println(hobby);
}
response.getWriter()
•response.getWriter()返回的是PrintWriter,这是一个打印输出流。
•response.getWriter().print(),不仅可以打印输出文本格式的(包括html标签),还可以将一个对象以默认的编码方式转换为二进制字节输出
•response.getWriter().writer(),只能打印输出文本格式的(包括html标签),不可以打印对象。
PrintWriter out=response.getWriter();
out.print(json);
// response.getWriter().print(json);
out.flush();
out.close();
Servlet提交的中文乱码问题
可以通过转编码utf-8来解决
//提交操作转码
String context =request.getContextPath();
//响应操作转码
response.setHeader("content-type","text/html;charset=UTF-8");
//response.setCharacterEncoding("UTF-8");
转发与重定向
- forward和redirect的区别
- 1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.
//请求转发,发生在服务器内部,地址栏没有转发路径变化 ————这个Servlet一共一次路径变化
request.getRequestDispatcher("/success.jsp").forward(request,response);
//请求重定向(需要加上项目名),地址栏发生变化,即为success.jsp ————这个Servlet一共两次路径变化
//重定向可以跳转到其他项目String context =request.getContextPath();
//response.sendRedirect(context+"/success.jsp");
四大作用域
- application(ServletContext)作用范围:整个Web应用。
- session 域 (HttpSession) 作用范围:一次会话。默认为30分钟。
- request域 --(HttpServletRequest) 作用范围:整个请求链(请求转发也存在)。
- pageContext域—(PageContext) 作用范围:整个JSP页面,是四大作用域中最小的一个。
//request.setAttribute("user",user);
//session作用域,一次会话有效
HttpSession session=request.getSession();
session.setAttribute("user",user);
文件上传(通过@MultipartConfig注解方法)
- jsp页面form的method必须是post,而且需要加enctype=“multipart/form-data”
<form id="regForm" name="regForm" method="post" action="upload" enctype="multipart/form-data">
<table>
<tr>
<td>头像:</td>
<td><input type="file" name="file"/>
</td>
</tr>
</table>
<input type="submit" style="height: 30px;width: 80px;" value="登录"/>
</form>
- Servlet中获取文件并且保存文件到指定目录(建议重新随机生成文件名)
@WebServlet(name = "UploadServlet",urlPatterns = {"/upload"})
@MultipartConfig
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//判断是否选择了文件
if(request.getPart("file").equals(false)){
//获取上传的文件
Part part=request.getPart("file");
//随机生成新的文件名
String filename = UUID.randomUUID().toString().replaceAll("-", "");
//获取请求的信息
String name=part.getHeader("content-disposition");
//获取上传文件的目录
String root="D:\\upload\\";
System.out.println("测试上传文件的路径:"+root);
//获取文件的后缀
String ext=name.substring(name.lastIndexOf("."), name.length()-1);
System.out.println("测试获取文件的后缀:"+ext);
System.out.println("测试产生新的文件名:"+filename);
//上传文件到指定目录
part.write(root+filename+"."+ext);
//新图片
//File newfile =new File("D:\\upload\\" + filename+"."+ext);
}else {
System.out.println("没有选择文件");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}