发表于: 2017-10-27 21:47:30

2 696


今日完成的事情:

1;学习总结requestresponse的用法

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永久性跳转,我这里试了一下,感觉没啥区别,好像是涉及到搜索引擎优化什么鬼的,也简单操作一下有个印象吧

302sendRedirect

else {
   
//响应给浏览器,让他去访问fail这个页面(302临时性跳转)
   
response.sendRedirect("fail.html");

301setStatus

 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()

DAOStudentDAO

这里把驱动初始化放到构造方法里,一次就好

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;
}

ServletHeroListServlet

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>

最后运行,结果;问题出了几个写在下面了。


4servlet的增删改放到明天,任务继续推进一点mvc,把上面的查询用mvc的思想结合ServletJSP来操作

这里再说一下MVC的概念

M 代表模型(Model):模型就是数据,就是dao,beanpojo

V 代表 视图(View):就是网页, JSP,用来展示模型中的数据

C 代表 控制器(controller):控制器用来把不同的数据,显示在不同的视图上。 控制器的作用就是把不同的数据(Model),显示在不同的视图(View)上。

再说一下jsp概念

JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了Html语法中的java扩张(以 <%, %>形式)。JSPServlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户端。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。

简单来说就是,JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。

代码实战

实体类beandao不变主要看一下servletjsp

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

4jsp的时候先是报了500,,jar的原因;

接着是id属性找不到,仔细看了下,是get方法写漏了

 

收获:

1;利用servlet的查询数据库

2;结合jsp查询数据库

3responserequest的零碎总结


ps;整体流程都跑通了,但是代码涉及新的东西太多了,不是完全理解,明天加上注释试试

 

 

 



返回列表 返回列表
评论

    分享到