发表于: 2017-10-27 21:47:30
2 697
1;学习总结request和response的用法
a;先是request
System.out.println("浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"+request.getRequestURL());
System.out.println("浏览器发出请求的资源名部分,去掉了协议和主机名:"+request.getRequestURI());
System.out.println("请求行中的参数,只能看到get看不到post:"+request.getQueryString());
比较简单,就不列举了,有一点就是getQueryString获取请求行的参数必须是get才能看到,否则是null
b;然后是获取参数request.getParameter这里比较麻烦点,因为参数可能是一个也可能是多个,找了个例子,拿注册页面来说,有爱好的时候,可以选多个,就是多个参数,这个时候获取需要加values,看下代码
注册的html
<form action="register" method="get">
账号: <input type="text" name="name"><br>
密码: <input type="password" name="password"><br>
爱好: Music<input type="checkbox" name="hobby" value="book"><br>
Movie<input type="checkbox" name="hobby" value="movie"><br>
Book<input type="checkbox" name="hobby" value="music"><br>
<input type="submit" value="注册">
</form>
Servlet类
System.out.println("单值参数name:" + request.getParameter("name"));
//获取具有多值得参数,比如注册时候提交的使多选内容
String[] hobby = request.getParameterValues("hobby");
System.out.println("多值参数hobby:" + Arrays.asList(hobby));
System.out.println("Map遍历参数:");
//遍历所有的参数,并返回Map类型
Map<String, String[]> parameters = request.getParameterMap();
Set<String> paraNames = parameters.keySet();
for (String para : paraNames) {
String[] value = parameters.get(para);
System.out.println(para + ":" + Arrays.asList(value));
Web.xml映射路径
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
运行结果(这里出现问题写在下面了)
c; 获取头信息getheader,通过头信息名称,遍历
//getHeaderNames()获取浏览器所有的头信息名称
Enumeration<String> headerNames = request.getHeaderNames();
//根据头信息名称headerNames遍历出所有的头信息
while (headerNames.hasMoreElements()){
String header = headerNames.nextElement();
String values = request.getHeader(header);
System.out.printf("%s\t%s%n",header,values);
涉及到的还有一个格式化输出区别于println
运行结果,这里也不详细说了,实际上直接在浏览器开启调试模式也一样的效果。。。就是一些浏览器的相关信息;像语言类型压缩格式等,不过accept值得一提,也就是浏览器的接受类型text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
这也对应response的响应格式。
2;然后是Response用来给浏览器提供响应信息
a:这个前面基本上都用到了像最初的设置响应内容pw
PrintWriter pw = response.getWriter();
//pw是代表服务端发向浏览器的输出流
pw.println(html);
b;响应格式setContentType
//通过response.getWriter().println()发送到浏览器,并且定义响应到浏览器的文本格式为utf-8;
response.setContentType("text/html;charset = UTF-8");
PrintWriter pw = response.getWriter();
上面提到request的获取头信息,可以看出来text/html是存在的,这里换一种浏览器不支持的accept格式,看一下text/dudada
//在doGet中,输出html;分别是标题元素h1和当前时间的字符串
response.getWriter().println("<h1>Servlet: Hello Bigdudada !!!</h1>");
response.getWriter().println(new Date().toLocaleString());
response.setContentType("text/dudada");
这里发现一个有趣的事情,就是随便写个格式。。。火狐,edge识别不了,但是强大的chrome就很牛逼了。。。啥格式都通吃。。。。实际上应该是谷歌自动把这段文字当做纯文本处理了,而不是渲染htm的效果,把text也换掉就都没招了。。。
c;响应编码的设置,这里就一点吧,就是必须放在respose调用之前
第一次想着两次输出不同的内容,就把编码设置放到中文前面,没有放到最开始调用之前,结果中文是乱码,因此必须放到第一次调用之前。
//在doGet中,输出html;分别是标题元素h1和当前时间的字符串
response.getWriter().println("<h1>Servlet: Hello dudada !!!</h1>");
//response.setCharacterEncoding("utf-8");
response.getWriter().println("<h1>Servlet: 我是中文 !!!</h1>");
response.getWriter().println(new Date().toLocaleString());
最后是这个响应编码的设置还有一种感觉用处不大,不知道以后是否会用到,这里也了做了注释
//发送到浏览器的内容会使用UTF-8编码,并且让浏览器也使用UTF-8编码方式进行显示,所以正常显示中文
response.setContentType("text/html;charset=utf-8");
//仅仅是发送的浏览器的内容是UTF-8编码的,置于浏览器是用哪种编码方式显示不管,由浏览器自己默认
//所以当所用的浏览器显示编码方式不是UTF-8的时候,就会看到乱码,估计还需要再进行设置。
response.setCharacterEncoding("UTF-8");
d;最后再说一个response的跳转问题,昨天的页面跳转就是302客户端跳转,还有一种301永久性跳转,我这里试了一下,感觉没啥区别,好像是涉及到搜索引擎优化什么鬼的,也简单操作一下有个印象吧
302的sendRedirect
else {
//响应给浏览器,让他去访问fail这个页面(302临时性跳转)
response.sendRedirect("fail.html");
301的setStatus
else {
//响应给浏览器,让他去访问fail这个页面(302临时性跳转)
//response.sendRedirect("fail.html");
response.setStatus(301);
response.setHeader("Location" , "fail.html");
3;开始学习servlet查询数据库,这里说一下主要步骤
实体类Student
public class Student
{
public int id;
public String name;
public int study_id;
public int qq;
public int getId()
DAO类StudentDAO
这里把驱动初始化放到构造方法里,一次就好
public StudentDao()
{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
然后写一个getconnection方法,简洁易于维护
public Connection getConnection() throws SQLException
{
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/task1?" +
"characterEncoding=utf-8", "root", "1234");
}
然后就是查询方法
public List<Student>list()
{
return list(0, Short.MAX_VALUE);
}
public List<Student> list(int start, int count)
{
//Student student = null;
List<Student> students = new ArrayList<>();
String sql = "select * from student order by id asc limit ?,? ";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql)) {
ps.setInt(1, start);
ps.setInt(2, count);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Student student = new Student();
int id = rs.getInt(1);
String name = rs.getString(2);
int study_id = rs.getInt(3);
int qq = rs.getInt(4);
student.id = id;
student.name = name;
student.study_id = study_id;
student.qq = qq;
students.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
Servlet类HeroListServlet
response.setContentType("text/html; charset=UTF-8");
List<Student> students = new StudentDao().list();
StringBuffer sb = new StringBuffer();
sb.append("<table border='1' cellspacing='0'>\r\n");
sb.append("<tr><td>id</td><td>name</td><td>Study_id</td><td>qq</td></tr>\r\n");
String trFormat = "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td></tr>\r\n";
for (Student student : students) {
String tr = String.format(trFormat, student.getId(), student.getName(), student.getStudy_id(), student.getQq());
sb.append(tr);
}
sb.append("</table>");
response.getWriter().write(sb.toString());
映射web.xml
<servlet>
<servlet-name>StudentListServlet</servlet-name>
<servlet-class>com.jnshu.servlet.StudentListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentListServlet</servlet-name>
<url-pattern>/listStudent</url-pattern>
</servlet-mapping>
最后运行,结果;问题出了几个写在下面了。
4;servlet的增删改放到明天,任务继续推进一点mvc,把上面的查询用mvc的思想结合Servlet和JSP来操作
这里再说一下MVC的概念
M 代表模型(Model):模型就是数据,就是dao,bean,pojo
V 代表 视图(View):就是网页, JSP,用来展示模型中的数据
C 代表 控制器(controller):控制器用来把不同的数据,显示在不同的视图上。 控制器的作用就是把不同的数据(Model),显示在不同的视图(View)上。
再说一下jsp概念
JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了Html语法中的java扩张(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户端。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。
简单来说就是,JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。
代码实战
实体类bean和dao不变主要看一下servlet和jsp
Servlet
response.setContentType("text/html; charset=UTF-8");
List<Student> students = new StudentDao().list();
request.setAttribute("students",students);
request.getRequestDispatcher("listStudent.jsp").forward(request,response);
jsp
运行结果,中间出了几次小问题,放到下面
明日计划的事情:
1;把昨天做的查询加上注释
2;完成遗留增删改
3;基础学习,昨天查询工作涉及新概念不少,花了时间比较多,总结一下
遇到的问题及解决方法:
1;不知道为什么突然路径都失效了。。必须加上后缀html才可以访问,好像分开写就可以。。。
之前的登陆界面也是输入映射路径不会出现登陆界面。。。而是直接跳转到失败页面
2;查询数据库第一个问题,是不小心参数写错了,只查出来了字段名
3;第二个是格式错了,格式化输出的时候整型写成f了
4;jsp的时候先是报了500,,jar的原因;
接着是id属性找不到,仔细看了下,是get方法写漏了
收获:
1;利用servlet的查询数据库
2;结合jsp查询数据库
3;response和request的零碎总结
ps;整体流程都跑通了,但是代码涉及新的东西太多了,不是完全理解,明天加上注释试试
评论