6月1日

在使用html文件完成了前端视图层的代码编写之后,各个页面包含的数据内容得以很好地展现。接下来我进行了与后端对接的工作,主要完成的内容是将html文件替换成jsp文件,在jsp页面中优化html页面的展示,并为完成后端代码编写工作的组员提供controller层后端接口。由于前端并未获得后端产生的数据,所以需要在各个controller文件的函数中自己输入测试数据以存入session,再进行前端跳转是否正常、是否与后端传入session数据对应的检测。

html文件与jsp文件的转换:

使用html文件可以在编写视图层代码的过程中易于调试,而在与后端实现更好的对接时需要使用jsp文件,使得页面中的数据更好地获取与展现。实现html文件到jsp文件的转换,首先需要加入jsp的头部声明与jsp常用工具c的声明:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

以岗位推荐和岗位搜索中多条岗位信息的展示为例,使用工具c进行循环与条件的判断,以实现前端组件可以根据后端数据的情况来展示。这部分的html代码在之前的博客有提到,替换为jsp代码后的情况如下:

<c:forEach var="jd" items="${sessionScope.jdList}" varStatus="no">
    <div class="col-12 col-lg-6" style="display: inline">
        <div class="card">
            <div class="card-header">
                <ul class="nav nav-pills card-header-pills pull-right" role="tablist">
                    <li class="nav-item">
                        <a class="nav-link active" data-toggle="tab" href="#tab-${no.count*3}">公司信息</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" data-toggle="tab" href="#tab-${no.count*3+1}">岗位信息</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" data-toggle="tab" href="#tab-${no.count*3+2}">岗位描述</a>
                    </li>
                </ul>
            </div>
            <div class="card-body">
                <div class="tab-content">
                    <div class="tab-pane fade show active" id="tab-${no.count*3}" role="tabpanel">
                        <h1 class="card-title">${jd.getPositionName()}</h1>
                        <p class="card-text">${jd.getCompanyName()}</p>
                        <a href="${pageContext.request.contextPath}/toDetailsPage${jd.getPositionId()}" class="btn btn-primary">查看详情</a>
                    </div>
                    <div class="tab-pane fade" id="tab-${no.count*3+1}" role="tabpanel">
                        <div class="admin-task-bd">
                            <p>工作城市:${jd.getAddress()}</p>
                            <p>公司性质:${jd.getCompanyInfo()}</p>
                            <p>招聘名额:
                                <c:if test="${jd.getHeadCount()<0}">
                                    若干人
                                </c:if>
                                <c:if test="${jd.getHeadCount()>0}">
                                    ${jd.getHeadCount()}
                                </c:if>
                            </p>
                            <p>薪资:${jd.getSalary()}</p>
                        </div>
                        <a href="${pageContext.request.contextPath}/toDetailsPage${jd.getPositionId()}" class="btn btn-primary">查看详情</a>
                    </div>
                    <div class="tab-pane fade" id="tab-${no.count*3+2}" role="tabpanel">
                        <p class="card-text">${jd.getJobDescription()}</p>
                        <a href="${pageContext.request.contextPath}/toDetailsPage${jd.getPositionId()}" class="btn btn-primary">查看详情</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</c:forEach>

前后端对接的工作内容:

以岗位搜索中选择城市的按钮为例,在前端文件中更换href的路径,以此跳转至后端controller层,前端代码的编写方式如下:

<a class="dropdown-item" style="display: inline" href="${pageContext.request.contextPath}/selectCity北京"> 北京</a>
<a class="dropdown-item" style="display: inline" href="${pageContext.request.contextPath}/selectCity上海"> 上海</a>
<a class="dropdown-item" style="display: inline" href="${pageContext.request.contextPath}/selectCity广州"> 广州</a>
<a class="dropdown-item" style="display: inline" href="${pageContext.request.contextPath}/selectCity深圳"> 深圳</a>

而在后端controller层需要编写函数,以@RequestMapping注解的形式接收此跳转,并获取cityName的值。在函数内进行数据的获取与处理,并在此为后端的组员备注需要获取与传递的数据形式,最后调用return "searchPage"可以回到前端的searchPage.jsp页面:

@RequestMapping("/selectCity{cityName}")
public String selectCity(@PathVariable String cityName, HttpSession session) {
    //将cityName设为筛选城市
    if (cityName.equals("全部")) {
        cityName = null;
    }
    session.setAttribute("cityName",cityName);
    //后端需要实现:通过城市、行业、最低薪资查找得出结果返回到list里面
    return "searchPage";
}

后端controller层的定义以及前后端对接测试代码的编写:

编写AllController文件,为后端设置跳转路径,并进行数据的request、response简单处理测试。controller方法的定义如下:

@Controller
public class AllController {

    @RequestMapping("/toLogin")
    public String toLogin(HttpSession session);

    @RequestMapping("/toRegister")
    public String toRegister(HttpSession session);

    @RequestMapping("/login")
    public String login(String phoneNumber, String password, HttpSession session);

    @RequestMapping("/register")
    public String register(String username, String phoneNumber, String password, String passwordCheck, HttpSession session);

    @RequestMapping("/toRecommendPage")
    public String toRecommendPage(HttpSession session);

    @RequestMapping("/toRecommendPage1")
    public String toRecommendPage1(HttpSession session);

    @RequestMapping("/toSearchPage{pageId}")
    public String toSearchPage(@PathVariable int pageId,HttpSession session);
    
    @RequestMapping("/toDetailsPage{positionId}")
    public String toDetailsPage(@PathVariable int positionId, HttpSession session);

    @RequestMapping("/addToCollection{positionId}")
    public String addToCollection(@PathVariable int positionId, HttpSession session);

    @RequestMapping("/cancelCollection{positionId}")
    public String cancelCollection(@PathVariable int positionId, HttpSession session);

    @RequestMapping("/selectCity{cityName}")
    public String selectCity(@PathVariable String cityName, HttpSession session);

    @RequestMapping("/selectIndustry{industry}")
    public String selectIndustry(@PathVariable String industry, HttpSession session);

    @RequestMapping("/selectMinSalary{minSalary}")
    public String selectMinSalary(@PathVariable String minSalary, HttpSession session);

    @RequestMapping("/aboutUs")
    public String aboutUs(HttpSession session);

    @RequestMapping("/toProfile")
    public String toAnalyse(HttpSession session);

    @RequestMapping("/uploadFile")
    public String uploadFile(HttpSession session);

    @RequestMapping("/toIndustryAnalyse{industry}")
    public String toIndustryAnalyse(@PathVariable String industry, HttpSession session);

}

我在负责前端工作的同时,需要在controller层中设置自测数据,观察在前后端对接的过程中,前端的显示是否正确。以进入到岗位详情页面为例,需要完成的函数编写如下:

@RequestMapping("/toDetailsPage{positionId}")
public String toDetailsPage(@PathVariable int positionId, HttpSession session) {
    //根据某一岗位id获取到该条岗位信息详情,将jd放入session中
    System.out.println(positionId);
    Jd jd = new Jd();
    jd.setPositionId(positionId);
    jd.setCompanyName("杭州科技有限公司");
    jd.setPositionName("软件工程师");
    jd.setAddress("杭州");
    jd.setCompanyInfo("民营公司,电子技术/半导体/集成电路");
    jd.setHeadCount(10);
    jd.setSalary("6-8千/月");
    jd.setJobDescription("JobDescription");
    jd.setUrl("https://msearch.51job.com/jobs/hangzhou/131327734.html?rc=03");
    session.setAttribute("jd",jd);
    //查询收藏表有没有收藏这个岗位,有就把isCollection设为true,否则设为false
    //session.setAttribute("isCollection",true);
    return "details";
}

经过了如上的前端优化以及与后端对接的工作,我们成功地将所有前端页面与后端框架相连接起来,并为实现后端编码工作的组员提供了结构的规范,最终完成了前端数据的展示以及项目前后端代码的对接。